2017-05-04 65 views
0

我有以下可選的,一對多的關係:PackingSlip <->> LineItem大廈卡宴表達式的EXISTS子查詢

我需要將所有不具有任何相關LineItem實例與qtyOrdered>qtyShippedPackingSlip實例相匹配。

什麼是最有意義的我將是沿行寫的表達式:這也是我希望沿行生成SQL

PackingSlip.LINE_ITEMS.containsMatch(LineItem.QTY_ORDERED.lt(LineItem.QTY_SHIPPED)).notExp(); 

SELECT t0.id, ... FROM packing_slip t0 
WHERE NOT ( 
    EXISTS ( 
    SELECT * FROM line_item t1 
    WHERE t1.packing_slip_id = t0.id 
    AND t1.qty_ordered < t1.qty_shipped 
) 
) 

顯然,我制定了containsMatch(Expression)方法。既然這樣的事情不存在(目前),那麼在卡宴4.0中完成這件事的最好方法是什麼?

回答

1

雖然我不是EJBQLQuery的大風扇,它實際上可以幫助在這裏:

String ejbql = 
    "SELECT ps FROM PackingSlip ps " + 
    "WHERE NOT EXISTS " + 
    "(SELECT li FROM LineItem li WHERE li " + 
    "MEMBER OF ps.lineItems AND li.qtyOdered < li.qtyShipped)"; 

EJBQLQuery query = new EJBQLQuery(ejbql); 
List<PackingSlip> objects = context.performQuery(query); 

除了SQLSelect查詢。

+0

謝謝@andrus_a。 EJBQL一直和我手動編寫SQL一樣有效。它帶有許多與我一樣使用像Cayenne這樣的ORM來避免的缺點! EJBQL(就像硬編碼的SQL)很容易與數據庫不同步。例如,沒有編譯器看着我的後背告訴我'LineItem'已被重命名爲'OrderItem'。這一切都在我身上,正如任何人都可以告訴你的,這不是無錯代碼的祕訣。 –

相關問題