Hibernate条件查询,它使用相关实体的主键来过滤结果

ben*_*rre 3 hibernate jpa hibernate-criteria

在我们的系统中,我们的数据库如下所示

一个代理商有很多经纪人,一个经纪人有很多用户,一个用户有很多订单.

我正在尝试使用hibernate标准来查找指定经纪商下的所有用户订单.在简单的SQL中,这将非常容易.我可以在条件api中执行此操作吗?我发现在使用点击和过滤器类型时,条件api工作得特别好,因为您可以构建一个非有序的限制列表并将它们添加到条件中.

目前我有这个不起作用

final Session session = (Session) entityManager.getDelegate();
    final Brokerage brokerage = userAdmin.loadBrokerage(brokerageId);
    @SuppressWarnings({"UnnecessaryLocalVariable", "unchecked"})
    final List<UserOrder> userOrders = session
            .createCriteria(UserOrder.class)
            .add(Restrictions.eq("user.brokerage", brokerage))
            .list();
Run Code Online (Sandbox Code Playgroud)

我收到消息"由以下原因引起:org.hibernate.QueryException:无法解析属性:user.brokerage:com.printlogix.rp.server.domain.UserOrder:".

你能将param名称传递给Restrictions.eq,如"object.parentobject.property"吗?

JB *_*zet 6

您不能像在HQL中那样链接关联.相反,您需要定义子标准或别名:

Criteria c = session.createCriteria(UserOrder.class);
Criteria userCriteria = c.createCriteria("user");
userCriteria.add(Restrictions.eq("brokerage", brokerage));
Run Code Online (Sandbox Code Playgroud)

要么

Criteria c = session.createCriteria(UserOrder.class);
c.createAlias("user", "user");
c.add(Restrictions.eq("user.brokerage", brokerage));
Run Code Online (Sandbox Code Playgroud)

这在Criteria的javadocHibernate参考文档中有记录.