JPA Criteria查询连接表达式上的selectCase

时间:2014-07-07 19:51:21

标签: jpa criteria-api

我有一个正在加载某些值和关系(连接)计数的Tuple查询。我试图获得第三列基于来自该连接的选择案例值,无论连接集合是否包含某些值,但我真的很挣扎。

一般要点是用户可以通过UserFavorite对象来收藏资产。我想选择3件事:

1)资产ID 2)它被收藏的次数 3 **)此资产是否已被请求查询的用户收藏

在SQL领域,我这样做:

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;

下面的Tuple查询的前两部分工作正常,但我无法完成其余的工作:

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 个答案:

答案 0 :(得分:1)

您是否尝试过关注?

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