2010-03-30 150 views
1

我在Hibernate中使用别名的概念挣扎了一下。
我的情况是这样的:
订购休眠标准 - 别名

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

的OrderDetail

@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)); 

所以我WA nt搜索包含产品的每个订单。
但是,使用这个查询,它一直返回0个命令,我并不真正看到我做错了什么。
谢谢!

+0

打开SQL日志记录(在hibernate.properties中设置'hibernate.show_sql = true')并查看生成的查询。然后把它们展示给我们。 – 2010-03-30 08:08:24

回答

1

的查询看起来还好我... 尝试设置“hibernate.show_sql”为“true”,所以你其实可以看到SQL中的System.out 或/和记录它log4j.logger.org。 hibernate.SQL = DEBUG,SQL_APPENDER

@lars是的,你可以。 Criteria API - Associations 别名只是一个全名/路径 carCriteria.createAlias(“car_parts.wheels”,“车轮”)

+0

当我开始筛选某些部分以查看错误的位置时,我发现在影响结果的其他部分中出现错误。 非常感谢:-) – Ignace 2010-03-30 14:28:29

0

我不确定你可以使用别名不是列的东西,即没有@Column@JoinColumn -annotation。

0

这看起来正确的短名称。

在您的DAO部分,您已经有一个名为'c'的变量 - 您可以在代码初始化的位置发布代码吗?这只是为了仔细检查你是否正在用Order.class创建原始标准。

那么接下来的事情,以检查是否可以与下面的那个ID retreive产品:

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

这样,你正在检查该ID是正确和Hibernate能找到该产品。

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