当前位置: 首页 > 知识库问答 >
问题:

使用左连接筛选结果的Hibernate条件

壤驷睿
2023-03-14

带hibernate的JSF应用程序

有没有一种方法可以使用联接来过滤条件列表返回的结果<我有两张桌子。订单和顾客。

@Entity(name = "order")
public class Order
{
    @Id
    private int id;
    private String billingCustomerId;
    private String shippingCustomerId;
    private Date orderDate;
    ....
}

@Entity(name = "customer")
public class Customer
{
    @Id
    private String id;
    private String name;
    private String emailAddress

    ....
}

我需要返回丢失电子邮件地址的客户的所有订单,以及所有order.billingCustomeId=null和CustomeId=nullorder.shipping订单。

客户可以在billingCustomerIdshippingCustomerId上进行匹配。

我将使用的SQL

sql prettyprint-override">select o.* from order as o
LEFT  join customer as c1 on o.billingCustomerId = c1.id
LEFT  join customer as c2 on o.shippingCustomerId= c2.id
where (o.billingCustomerId is null and o.shippingCustomerId is null) or 
(o.billingCustomerId is not null and c1.emailAddress is null) or
(o.shippingCustomerIdis not null and c2.emailAddress is null)

Hibernate标准

Criteria criteria1 = session.createCriteria(Order.class);
criteria.add(Restrictions.and(Restrictions.isNull("billingCustomerId"),
Restrictions.isNull("shippingCustomerId"));
List<Order> = criteria.list();

这将返回billing/shipping customer=null的订单列表。

我如何更改标准,使其也包括缺少电子邮件地址的客户的订单?

Disjunction disjunciton = Restrictions.disjunction();
Criteria criteria = session.createCriteria(Order.class);
disjunciton.add(Restrictions.and(Restrictions.isNull("billingCustomerId"),
        Restrictions.isNull("shippingCustomerId")));
disjunciton.add(...


                ...)
criteria.add(disjunciton);
List<Order> = criteria.list();

我还没有找到在列上连接的例子,但只在表有公共键的地方。

共有1个答案

梅宏盛
2023-03-14

我问了这个问题:Hibernate很难让复合键工作,发现Hibernate只能在通过关联2个对象创建的列上创建一个连接。我将在我的答案中添加更多信息,以提供更多有用的信息,但是最好的选择是你的情况是使用上面显示的查询执行ession.createSQLQuery()。然后在运行查询之前,将Query.add实体(Order.class)。addEntity(Customer.class)。只要您的查询返回正确的行来正确填写Java对象,Hibernate就可以自动填充它们。如果这不起作用,您仍然可以检索数据并自己手动填充。

 类似资料:
  • 我有两个表,我想在这两个表连接在一起之前过滤这一个表。 客户表: 条目表: 我想左联接,所以我从客户表中获取所有记录,不管入口表中是否有相关记录。然而,我想在联接前过滤入口表中的类别D。 预期结果: 如果我要做以下查询: 这将过滤掉最后一条记录。 所以我想要左表中的所有行,并将其连接到在类别D上过滤的条目表。 谢谢你的帮助!!

  • 问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用休眠标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 对于简短的解释,请参考此问题,如何使用struts2-jqgrid插件在jqgrid

  • 问题内容: 我正在尝试使用数组映射进一步过滤对象,以准备将其发送到服务器进行保存。我可以过滤为1个键值,这很不错,但是我想更进一步,将其与布尔值内部进行比较。 所以,现在这就是我所拥有的- 这对于拉出id很有用,但是如果它们的选定值== false,我不想将它们压入这个新数组中,因此我将一个条件作为进一步过滤条件。这有点奏效,我得到了一个id数组,但是具有.selected == false的id

  • 另一个宽大处理--B: 这里要注意,实体A和B之间没有隐式关系,B表中的a_id是手工处理的,因此--关系类似于一对多(A-->B),但不是jpa-hibernate关系。而且,我的FullDto有A的所有属性和B的列表: 现在,我想从A的存储库接口中提取所有内容(A和B表一次完成),如下所示:

  • 问题内容: 我有两个实体,和每一个与活跃布尔参数和关系。 此布尔参数用于逻辑删除。 当我在下面运行此查询时,为什么结果中包含不活动的角色? 问题答案: 考虑以下s与的关系。 User-1 : Active-Role-1, Active-Role-2, In-Active-Role-3 User-2 : In-Active-Role-3 User-3 : Active-Role-1, Active-

  • 我对教义不熟悉,现在我想做以下事情。 表“用户朋友”: 此表包含联系人列表的条目。 现在我想得到一个条目的结果,比如: 此查询将用于从联系人列表中获取未经对方朋友确认的条目(其中b为空,他尚未将“我”添加到联系人列表中)。我希望你明白我在找什么。 我不确定b为NULL的位置是否正确,或者如果已经有另一个条目(表中已确认的朋友),如何检查一个查询,正确的方法是什么?我的想法类似于左连接,你可以在上面