JPA / Criteria - 在SetAttribute上选择(或多选)

时间:2011-05-27 07:44:14

标签: hibernate jpa criteria setattribute

我真的很沮丧尝试使用JPA标准(我正在使用Hibernate实现)..我想进行一个查询,其中select是在一组对象上,但我不能让它工作..

这是我的代码:

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”是一个集合(cf metamodel:“SetAttribute”),我希望得到一个List&gt;,但我实际上得到一个展平列表List ... Hibernate实际上生成了一个单独的SQL查询,当我期望得到我的List的每个项目/集合的查询....

但我最初想要的是使用多选来进行查询以获得几个字段,其中一个是我的Set ..如果我尝试用我的“Contact_.groupes”进行多选,例如“联系。 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

正如您在第一次昏迷之后看到的那样:“。作为col_1_0_”,这不是有效的SQL查询..

所以我真的不知道怎么做我想要的东西..在我的对象上联系,所有字段都很渴望,因为当我加载一个联系人时我关闭了事务,因此对象被分离并且不允许我获取数据延迟加载。但是我有一个“搜索屏幕”,我正在显示所有联系人字段的子集。所以为了大幅增加性能,我愿意为这部分做一个特定的查询,只加载我需要的而不是“SELECT” * FROM联系方式“......

有人知道发生了什么以及如何解决我的问题吗?

0 个答案:

没有答案