Hibernate标准使用左连接来过滤结果

时间:2014-09-11 22:11:46

标签: java hibernate

使用hibernate的JSF应用程序

有没有办法使用联接过滤条件列表返回的结果?
示例:我有2个表。订单和客户。

@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.billingCustomerId = nullorder.shippingCustomerId = null的所有订单退回所有订单。

客户可以匹配billingCustomerIdshippingCustomerId

我会使用的SQL

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

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 个答案:

答案 0 :(得分:0)

我问过这个问题:Hibernate trouble getting composite key to work并且发现Hibernate只能在通过关联2个对象创建的列上创建连接。我将在我的答案中添加更多内容以提供更多有用的信息,但您最好的选择是使用上面显示的查询来执行Session.createSQLQuery()。然后在运行查询之前先放入Query.addEntity(Order.class).addEntity(Customer.class)。只要您的查询返回正确的行以正确填充Java对象,Hibernate就可以自动填充它们。如果这不起作用,您仍然可以自己检索数据并手动填充它。