Java Hibernate条件-如何将联接结果限制为单个实体类型?
好的,下面的查询:Java Hibernate条件-如何将联接结果限制为单个实体类型?,java,sql,hibernate,criteria,Java,Sql,Hibernate,Criteria,好的,下面的查询: SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’; 可以使用以下标准执行此操作: List ordersAndProducts = session.createCriteria(Order.class) .setFetchMode(“products”,FetchMode.JOIN) .add(Restrictions.eq(“id
SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE
O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;
可以使用以下标准执行此操作:
List ordersAndProducts = session.createCriteria(Order.class)
.setFetchMode(“products”,FetchMode.JOIN)
.add(Restrictions.eq(“id”,”1234”))
.list();
但是这里的Criteria.list()
返回一个list
,其中对象[0]
是一个顺序
,对象[1]
是列表中每个元素的产品
但如何使用条件执行以下SQL操作:
SELECT O.* FROM ORDERS O, PRODUCT P WHERE
O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;
换句话说,我想要
Criteria.list()
给我一个列表
,我不关心产品
。我尝试使用createAlias()
而不是setFetchMode()
,但是结果是一样的,并且投影不允许指定实体,只允许指定属性 您可以在标准上使用.setResultTransformer(CriteriaSpecification.DISTINCT\u ROOT\u ENTITY)
List ordersAndProducts = session.createCriteria(Order.class)
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
.setFetchMode(“products”,FetchMode.JOIN)
.add(Restrictions.eq(“id”,”1234”))
.list();
现在,您可以检索所有急切装载产品的订单。使用
Criteria
类中的createCriteria
方法来处理关系
List ordersAndProducts = session.createCriteria(Order.class)
.createCriteria(“products”)
.add(Restrictions.eq(“id”,”1234”))
.list();
您可以阅读有关它的文档(有点混乱)。不,我已经尝试过了,没有什么区别,仍然会得到一个包含订单和产品的对象数组列表。如果您真的不关心产品(以后不调用产品),这应该会表现得更好。查看您的映射或注释。您是否指示hibernate通过fetch急切地加载产品关联。这可能就是原因。我不确定,但我相信criteria API遵守此指令。我在Order类中为产品提供的注释是@ManyTone(fetch=FetchType.LAZY)。唯一适合我的解决方案是你上面使用的ResultTransformer。谢谢!我怀疑使用ResultTransformer会是一种方式,但相当不透明的文档对于知道使用哪一种没有多大帮助。回答不错(geht doch…:-)我在哪里可以找到关于setResultTransformer(CriteriaSpecification.DISTINCT\u ROOT\u ENTITY)的更多解释?