0

我正在尝试在项目中进行相当复杂的 Criteria 查询。

此特定示例由 2 个数据库表组成:ORDER 和 PAYMENT。ORDER 表有一个包含订单总价格的字段(即一个名为“Money”的嵌入式 Hibernate 实体,由属性“amount”和货币的枚举值组成)。

PAYMENT 表还有一个金额列,其中包含客户已支付的金额。每个订单包含订单总价和付款。订单不一定要有付款,因此 payment 属性可以为空。休眠映射本身有效。

在我的 DAO 中,我有一个 Order 对象的标准,该对象已经包含一些限制。我现在需要做的是查询总订单价格在 2 个值之间的所有订单。这看起来像:

criteria.add(Restrictions.and(Restrictions.ge("orderTotalPrice.amount", amountFrom),
                    Restrictions.le("orderTotalPrice.amount", amountTo)));

此外,我需要获取所有包含付款金额在相同两个值之间的付款的订单。如果 paymentAmount 是 Order 实体的一个属性,我们可以这样:

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:这些是(简化的)休眠实体类:

@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
}
4

1 回答 1

0

我不确定我是否完全理解您的需求,但使用别名通常比使用子标准更容易:

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

于 2013-08-18T21:19:09.747 回答