使用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 = null
和order.shippingCustomerId = null
的所有订单退回所有订单。
客户可以匹配billingCustomerId
或shippingCustomerId
。
我会使用的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();
我无法找到加入列的示例,但只能找到表中有共用键的示例。
答案 0 :(得分:0)
我问过这个问题:Hibernate trouble getting composite key to work并且发现Hibernate只能在通过关联2个对象创建的列上创建连接。我将在我的答案中添加更多内容以提供更多有用的信息,但您最好的选择是使用上面显示的查询来执行Session.createSQLQuery()。然后在运行查询之前先放入Query.addEntity(Order.class).addEntity(Customer.class)。只要您的查询返回正确的行以正确填充Java对象,Hibernate就可以自动填充它们。如果这不起作用,您仍然可以自己检索数据并手动填充它。