2014-07-07 3 views
1

몇 가지 값과 관계 (조인) 수를로드하는 튜플 쿼리가 있습니다. 조인 컬렉션에 어떤 값이 포함되어 있는지 여부에 관계없이 해당 조인의 select case 값을 기반으로하는 세 번째 열을 얻으려고하고 있지만 실제로 고민 중입니다.JPA 조건 쿼리 조인 식의 selectCase

일반적인 요점은 Assets가 UserFavorite 객체를 통해 사용자가 즐겨 찾기에 추가 할 수 있다는 것입니다. 나는 3 일을 선택하는 것을 시도하고있다 :

1) 자산 ID 2) 즐겨 찾기되었습니다 그것은 시간의 계산이 자산이 SQL 땅에서 쿼리

를 요청하는 사용자가 즐겨 찾기되었는지 여부를 3 **) 아래 잘 작동하는 튜플 쿼리의

select distinct a.asset_id, count(u.asset_id) as favorite_count, case when u.user_id in (XXXX) then 1 else 0 end as is_favorite_for_user from asset a left join user_favorite u on (a.asset_id = u.asset_id) group by a.asset_id; 

첫 번째 두 부분,하지만 난 나머지 얻을 수 없습니다 : 나는 이렇게

Root<Asset> assetRoot = assetQuery.from(Asset.class); 
SetJoin<Asset, UserFavorite> userFavoriteJoin = assetRoot.join(Asset_.userFavorites, JoinType.LEFT); 
assetQuery.select(criteriaBuilder.tuple(
    assetRoot.get(Asset_.assetId), 
    criteriaBuilder.count(userFavoriteJoin) 
)); 
assetQuery.distinct(true); 
assetQuery.groupBy(assetRoot.get(Asset_.assetId)); 

을 JPA Criteria에서 select case/in 문을 수행하는 방법을 이해할 수 없습니다. 이견있는 사람?

select/case보다 더 좋은 방법이 있습니까?

답변

1

다음을 시도해 보셨습니까?

assetQuery.select(criteriaBuilder.tuple(
      assetRoot.get(Asset_.assetId), 
      criteriaBuilder.count(userFavoriteJoin), 
      criteriaBuilder.selectCase().when(userFavoriteJoin.get(UserFavorite_.userId).in("XXXX"), 1).otherwise(0) 
    )); 
+0

이것은 정말 잘되었습니다. 너무 멀지 않았지만 selectCase ( selectCase ...)를 캐스팅하고 Boolean.TRUE 및 Boolean을 사용할 때 https://hibernate.atlassian.net/browse/HHH-4700을 실행했습니다. 반환 유형에서 1과 0 대신 FALSE. 다시 한 번 감사드립니다! – shauntarves