【问题标题】:JPA Criteria Query selectCase on join expressionJPA Criteria Query selectCase on join 表达式
【发布时间】:2014-08-28 09:54:41
【问题描述】:

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

一般的要点是用户可以通过 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;

以下元组查询的前 2 部分工作正常,但我无法获得其余部分:

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 更好的方法吗?

【问题讨论】:

    标签: jpa criteria-api


    【解决方案1】:

    你试过关注吗?

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

    【讨论】:

    • 效果非常好。我离得不远,但是当我尝试投射我的 selectCase (selectCase...) 并在我的返回类型中使用 Boolean.TRUE 和 Boolean.FALSE 而不是 1 和 0 时,我遇到了hibernate.atlassian.net/browse/HHH-4700 .再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2018-05-13
    • 2013-06-21
    • 2012-05-30
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多