Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate条件-如何将联接结果限制为单个实体类型?_Java_Sql_Hibernate_Criteria - Fatal编程技术网

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)的更多解释?