如何在连接JPA / Ebean上定义多个条件

时间:2013-12-10 02:45:03

标签: java jpa playframework playframework-2.0 ebean

好的,我可以说我有订单和商品表。这就是我的Order类中描述项目的方式:

@ManyToMany(cascade=CascadeType.PERSIST)
@JoinTable(name="MY_ORDER_ITEM_BRIDGE",
joinColumns=@JoinColumn(name="bridge_order_id",referencedColumnName = "order_order_id"),
inverseJoinColumns = @JoinColumn(name="bridge_item_id", referencedColumnName="item_item_id"))
private List<Item> items;

这很好用。但是让我们想象桥表中有一个名为MY_ORDER_ITEM_BRIDGE.expiration_date的日期。

我想将定义更改为仅包含尚未发生的expiration_date的项目。

所以我希望生成的SQL看起来像:

SELECT *
FROM order o
join my_order_item_bridge b
on b.bridge_order_id = o.order_order_id
join item i
on i.item_item_id = b.bridge_item_id
where b.expiration_date < sysdate;

我正在使用Ebean,Play Framework 2.1.3。谢谢你的帮助。

UPDATE :或者,它也可能是其中任何一个连接的第二个条件:

SELECT *
FROM order o
join my_order_item_bridge b
on b.bridge_order_id = o.order_order_id
and b.expiration_date < sysdate
join item i
on i.item_item_id = b.bridge_item_id

(如果可能的话,我想在类定义中而不是在原始SQL中执行此操作)

2 个答案:

答案 0 :(得分:3)

问题是ebean生成的桥表可以有两列而且只有两列:两个外键。

如果你想在那里有另一个字段,你应该将整个集合建模为三个实体:Order.java,Item.java和OrderItem.java。

为了强制完整性,您可以在OrderItem类中使用约束:

@Table(uniqueConstraints=@UniqueConstraint(columnNames={"order_order_id", "item_item_id"}))

答案 1 :(得分:1)