2017-05-04 2 views
0

존재 I이 다음과 같은 선택 사양, 일대 다 관계 : PackingSlip <->> LineItem건물 카이엔 표현식에 대한 하위 쿼리

내가 qtyOrdered>qtyShipped 어떤 관련 LineItem 인스턴스가없는 모든 PackingSlip 인스턴스와 일치해야합니다. 내가의 라인을 따라 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) 방법을 구성했다. 그러한 것이 존재하지 않기 때문에 (현재), Cayenne 4.0에서 이것을 달성하는 가장 좋은 방법은 무엇입니까? 내가 EJBQLQuery의 큰 팬이 아니다 동안

답변

1

, 실제로는 여기에 도움이 될 수 있습니다

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을 작성하는 것과 똑같은 방식으로 효과적입니다. 그것은 카이엔 같은 ORM을 사용하여 피할 수있는 동일한 단점을 가지고 있습니다. EJBQL (하드 코딩 된 SQL과 마찬가지로)은 데이터베이스와 쉽게 동기화되지 않습니다. 예를 들어,'LineItem'이'OrderItem'으로 이름이 바뀌 었음을 알리는 컴파일러가 없습니다. 모든 것이 나에게 달려 있으며 누구나 말할 수 있듯이 그것은 버그없는 코드를 만드는 방법이 아닙니다. –