【问题标题】:Hibernate Criteria - how to limit join results to a single entity type?Hibernate Criteria - 如何将连接结果限制为单个实体类型?
【发布时间】:2011-05-21 14:32:58
【问题描述】:

好的,所以下面的查询:

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<Object[]>,其中Object[0]OrderObject[1] 是列表中每个元素的Product

但是如何使用 Criteria 执行以下 SQL:

SELECT O.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’;

也就是说,我想让Criteria.list()给我一个List<Order>,我不在乎Products。我尝试使用 createAlias() 而不是 setFetchMode() 但结果是相同的,并且 Projections 不允许您指定实体,只能指定属性。

【问题讨论】:

    标签: java sql hibernate criteria


    【解决方案1】:

    Criteria 类使用createCriteria 方法来建立关系。

    List ordersAndProducts = session.createCriteria(Order.class)
        .createCriteria(“products”)
            .add(Restrictions.eq(“id”,”1234”))
        .list();
    

    您可以阅读有关它的(有点混乱的)文档here

    【讨论】:

    • 不,我已经尝试过了,没有区别,仍然得到一个包含订单和产品的对象数组列表。
    • 如果您真的不关心产品(以后不调用产品),这应该会更好。查看您的映射或注释。您是否指示 hibernate 通过 fetch 急切加载产品关联。这可能是原因。我不确定,但我相信标准 API 会遵守这条指令。
    • 我在 Order 类中为产品添加的注释是 @ManyToOne(fetch = FetchType.LAZY)。唯一对我有用的解决方案是您上面使用 ResultTransformer 的解决方案。
    【解决方案2】:

    您可以在条件上使用.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)

    List ordersAndProducts = session.createCriteria(Order.class)
        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
        .setFetchMode(“products”,FetchMode.JOIN)
        .add(Restrictions.eq(“id”,”1234”))
        .list();
    

    现在您检索所有带有热加载产品的订单。

    【讨论】:

    • 谢谢!我怀疑使用 ResultTransformer 会是一种方式,但是相当不透明的文档对于知道使用哪一个并没有多大帮助。
    • 不错的答案(geht doch ... :-))
    • 在哪里可以找到关于 setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 的更多解释?
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多