2013-08-01 1 views
0

기준에 맞게 HQL 쿼리를 이식하는 데 약간의 문제가 있습니다.HQL MEMBER OF 기준 변환

추상화를 위해 트랜잭션 -> 그룹 -> 계정 < - 내역 < - 트랜잭션과 같은 엔티티 트랜잭션, 계정, 그룹 및 히스토리가 있다고 가정 해 봅니다.

FROM Transaction t 
INNER JOIN t.history AS h 
INNER JOIN t.group AS g 
WHERE t.group IS NULL OR history.account MEMBER OF g.accounts 

그리고 지금은 다음을 수행해야합니다 enter image description here

가 나도 널 그룹 또는 그룹의 계정으로 모든 거래를 얻기 위해 다음 HQL 쿼리를 사용 : 또한 아래 ER 다이어그램을 참조하십시오 내 쿼리를 DetachedCriteria으로 변환하지만 최대 절전 모드 제한 사항으로 MEMBER OF 기준에 대한 방법이없는 이유를 모릅니다.

아무도 도와 줄 수 있습니까?

답변

0

, 나는 희망, 작업 쿼리는 다음과 같습니다

DetachedCriteria criteria = DetachedCriteria.forClass(Transaction.class, "t") 
.createAlias("t.history", "h") 
.add(Restrictions.or(Restrictions.isNull("t.group"), 
    Subqueries.propertyNotIn("h.account.id", DetachedCriteria.forClass(Group.class, "g") 
    .createAlias("g.accounts", "a", CriteriaSpecification.LEFT_JOIN) 
    .add(Restrictions.eqProperty("t.group.id", "g.id")) 
    .add(Restrictions.isNotNull("a.id")) 
    .setProjection(Projections.property("a.id"))))); 

그것은 우리의 문제를 해결합니다. 나는이 해답을 해결책으로 표시한다.

0

다음과 같이 Restrictions.eqProperty를 사용해야합니다. 희망이 당신을 도울 것입니다. 여기

DetachedCriteria hsql = DetachedCriteria.forClass(Transaction.class, "t") 
    .addAlias("t.history", "h") 
    .addAlias("t.group", "g") 
    .add(Restrictions.or(
     Restrictions.isNull("t.group"), 
     Restrictions.eqProperty("h.account", "g.account") 
    )); 
+1

감사합니다. 그러나 그룹에 계정 모음이 포함되어있어 단일 값과 모음을 비교할 수 없기 때문에이 방법이 저에게는 적합하지 않습니다. ( – vitalidze

+0

Restrictions.in ("h.account", new String [] { * accounts * /}), 계정 이름 모음을 가져와 Restrictions.in을 사용하십시오. –

+0

이미이 방법에 대해 생각해 보았지만 수천 개의 트랜잭션과 수백 개의 그룹 및 계정을 가질 수 있으므로 헤비급이고 확장 성이 없습니다. 많은 데이터를로드 할 필요없이 쿼리를 통해 동일한 작업을 수행하는 대신 각 트랜잭션에 대해 그룹과 관련된 모든 계정을 DB에서로드해야합니다. – vitalidze