限制包括一个小组
我试图在一个项目中做一个相当复杂的Criteria查询。
这个特殊的例子由2个数据库表组成:ORDER和PAYMENT。 ORDER表具有一个字段(即嵌入式Hibernate实体,名为“Money”,包含属性“金额”和货币的枚举值),其中包含订单的总价格。
付款表中还有一个包含客户已支付金额的金额栏。 每个订单都包含订单总价和付款。 订单不必付款,所以付款属性可以为空。 hibernate映射本身起作用。
在我的DAO中,Order对象对象的Criteria已经包含了一些限制条件。 我现在需要做的是查询所有订单价格在2个值之间的订单。 这看起来像这样:
criteria.add(Restrictions.and(Restrictions.ge("orderTotalPrice.amount", amountFrom),
Restrictions.le("orderTotalPrice.amount", amountTo)));
此外,我需要获得包含付款金额在相同两个值之间的所有订单。 如果paymentAmount是订单实体的财产,我们可以这样做:
criteria.add(Restrictions.or(
Restrictions.and(Restrictions.ge("orderTotalPrice.amount", amountTo),
Restrictions.le("orderTotalPrice.amount", amountFrom)),
Restrictions.and(Restrictions.ge("paymentAmount.amount", amountFrom),
Restrictions.le("paymentAmount.amount", amountTo))));
我的问题是,付款金额只存在于订单实体内的付款对象内。 因此,要获得订单的付款金额,我需要诸如“payment.paymentAmount.amount”之类的内容。 这当然不起作用,所以通常我会创建一个像这样的子标准:
criteria.createCriteria("payment").add(
Restrictions.and(Restrictions.ge("paymentAmount.amount", amountFrom),
Restrictions.le("paymentAmount.amount", amountTo)));
将上述示例和第一个示例添加到条件意味着订单价格和付款金额的金额必须相同。 我需要的是这两个限制之间的“或”。
所以我的问题是:标准API是否支持将标准添加到标准对象以表示另一个标准和子标准之间的OR?
我希望很清楚我的问题是什么。 如果有人需要更多信息,请不要犹豫,以添加评论!
提前致谢!
PS:这些是(简化的)hibernate实体类:
@Entity
public class Order {
@Embedded
private Money orderTotalPrice;
@OneToOne(optional = true)
private Payment payment;
// Getters & Setters
}
@Entity
public class Payment {
@Embedded
private Money paymentAmount;
// Getters & Setters
}
@Embeddable
public class Money {
@Column
private BigDecimal amount;
// Getters & Setters
}
我不确定我是否完全理解您需要的内容,但使用别名通常比使用子标准更容易:
Criteria c = session.createCriteria(Order.class, "order");
// join with payment:
c.createAlias("order.payment", "p");
// now you can refer to properties of order.payment using the "p" alias
c.add(Restrictions.or(
Restrictions.and(Restrictions.ge("p.paymentAmount.amount", amountFrom),
Restrictions.le("p.paymentAmount.amount", amountTo)),
Restrictions.and(Restrictions.ge("order.orderTotalPrice.amount", amountTo),
Restrictions.le("order.orderTotalPrice.amount", amountFrom))));
这对我来说更自然,因为它几乎是对以下HQL的直接翻译:
select order from Order order
join order.payment p
where (p.paymentAmount.amount >= :amountFrom and p.paymentAmount.amount <= :amountTo)
or (order.orderTotalPrice.amount >= amountFrom and order.orderTotalPrice.amount <= amountTo)
请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#querycriteria-associations
链接地址: http://www.djcxy.com/p/36983.html