好的,我可以说我有订单和商品表。这就是我的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中执行此操作)
答案 0 :(得分:3)
问题是ebean生成的桥表可以有两列而且只有两列:两个外键。
如果你想在那里有另一个字段,你应该将整个集合建模为三个实体:Order.java,Item.java和OrderItem.java。
为了强制完整性,您可以在OrderItem类中使用约束:
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"order_order_id", "item_item_id"}))
答案 1 :(得分:1)
您可以直接在ebean中使用SQL。见http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/RawSql.html