【问题标题】:Hibernate criteria -- alias休眠条件——别名
【发布时间】:2011-02-02 08:29:41
【问题描述】:

我在 Hibernate 中的别名概念上有点挣扎。
我的情况如下:
订单

@OneToMany(cascade=CascadeType.ALL,mappedBy="m_order")
private Set<OrderDetail> m_details; 

订单详情

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="product_id")
    private Product m_product;
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="order_id")
    private Order m_order;

DAO

c.createAlias("m_details", "detail").createCriteria("detail.m_product").add(Expression.idEq(productId));

所以我想搜索包含产品的每个订单。
但是,通过此查询,它一直返回 0 个订单,我真的不知道我做错了什么。
谢谢!

【问题讨论】:

  • 打开 SQL 日志记录(在 hibernate.properties 中设置 hibernate.show_sql=true)并查看生成的查询。然后将它们展示给我们。

标签: java hibernate orm hibernate-criteria


【解决方案1】:

这看起来是正确的。

在您的 DAO 部分中,您已经有一个名为“c”的变量 - 您可以发布初始化它的代码吗?这只是为了仔细检查您是否使用 Order.class 创建了原始条件。

接下来要检查您是否可以使用以下内容检索具有该 ID 的产品:

Product p = (Product)session.load(Product.class, productId)

这样您就可以检查 id 是否正确,并且 Hibernate 可以找到该产品。

我们不得不按照其他评论者的建议开始查看生成的 SQL。

【讨论】:

    【解决方案2】:

    我觉得这个查询没问题... 尝试将“hibernate.show_sql”设置为“true”,这样您实际上可以在 System.out 中看到 SQL 或/并记录它 log4j.logger.org.hibernate.SQL=DEBUG, SQL_APPENDER

    @lars 是的,你可以。 Criteria API - Associations 别名只是全名/路径的简称 carCriteria.createAlias("car_parts.wheels", "wheels")

    【讨论】:

    • 当我开始过滤某些部分以查看哪里出了问题时,我发现影响结果的其他部分存在错误。所以谢谢:-)
    【解决方案3】:

    我不确定您是否可以为非列的内容使用别名,即没有@Column@JoinColumn-annotation。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 2012-08-26
      • 2014-09-04
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多