我在尝试使用 JPA 标准时感到非常沮丧(我正在使用 Hibernate 实现)。我想在选择位于一组对象上的情况下进行查询,但我无法让它工作。
这是我的代码:
public List<Object> findAllTypeGroupes(){
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery(Object.class);
/* FROM */
Root<Contact> contactRoot = criteriaQuery.from(Contact.class);
/* SELECT */
criteriaQuery.select( contactRoot.get( Contact_.groupes ) );
return entityManager.createQuery(criteriaQuery).getResultList();
}
@StaticMetamodel(Contact.class)
public abstract class Contact_ {
public static volatile SingularAttribute<Contact, Integer> contactId;
public static volatile SetAttribute<Contact, TypeGroupe> groupes;
}
如果我尝试在“Contact_.groupes”上进行选择,其中“groupes”是一个集合(参见元模型:“SetAttribute”),我希望得到一个 List>,但实际上我得到的是一个扁平列表 List.. . Hibernate 实际上正在生成一个单独的 SQL 查询,当我期望为我的 List 的每个项目/集获取一个查询时......
但是我最初想要的是使用多选进行查询以获取几个字段,其中一个是我的集合。如果我尝试使用我的“Contact_.groupes”进行多选,例如“Contact.contactId”这里:
public List<Object[]> findAllWrapperByCriteria(ContactCriteria criteria){
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = criteriaBuilder.createQuery(Object[].class);
/* FROM */
Root<Contact> contactRoot = criteriaQuery.from(Contact.class);
criteriaQuery.multiselect( contactRoot.get( Contact_.contactId ), contactRoot.get( Contact_.groupes ) );
return entityManager.createQuery(criteriaQuery).getResultList();
}
事情显然不正常,这次我遇到了异常,因为 Hibernate 生成了一个错误的 SQL 查询:
select contact0_.CONTACT_ID as col_0_0_, . as col_1_0_, typegroupe2_.TYPE_GROUPE_ID as TYPE1_6_, typegroupe2_.LIBELLE as LIBELLE6_, typegroupe2_.MUT_TS as MUT3_6_, typegroupe2_.MUT_USER as MUT4_6_, typegroupe2_.REMARQUE as REMARQUE6_, typegroupe2_.VISIBLE as VISIBLE6_ from CONTACT contact0_ inner join CONTACT_GROUPE groupes1_ on contact0_.CONTACT_ID=groupes1_.CONTACT_ID inner join TYPE_GROUPE typegroupe2_ on groupes1_.GROUPE_TYPE_GROUPE_ID=typegroupe2_.TYPE_GROUPE_ID
正如您在第一个昏迷之后看到的那样:“.as col_1_0_”这不是一个有效的 SQL 查询。
所以我真的不知道如何做我想做的事。在我的对象联系人上,所有字段都急切,因为当我加载联系人时,我关闭了事务,因此对象被分离并且不允许我获取数据懒加载。但是我有一个“搜索屏幕”,其中显示了所有联系人字段的子集。因此,为了显着提高性能,我愿意对此部分进行特定查询并仅加载我需要的内容,而不是“选择” *来自联系人“...
有人知道发生了什么以及如何解决我的问题吗?