【问题标题】:translate jpa query to predicate for spring-data specification将 jpa 查询转换为 spring-data 规范的谓词
【发布时间】:2014-08-04 05:42:56
【问题描述】:

我需要将此 jpa 查询转换为谓词(用于 spring-data 规范):

select v.id from VideoImpl  v , in (v.assetSet.publishings) as p where p.channelId='23FFBE1B-65CE-4188-ADD2-C724186C2C9F' 

assetSet 是 ManyToOne 并发布 OneToMany 关系

Hibernate 生成的 sql 如下所示:

select videoimpl0_.id as col_0_0_ from Video videoimpl0_ inner join Asset videoimpl0_1_ on videoimpl0_.id=videoimpl0_1_.id inner join AssetSet assetsetim1_ on videoimpl0_1_.assetSetId=assetsetim1_.id left outer join AssetSet_Image assetsetim1_1_ on assetsetim1_.id=assetsetim1_1_.assetSetId inner join Publishing publishing2_ on assetsetim1_.id=publishing2_.assetSetId where publishing2_.channelId='23FFBE1B-65CE-4188-ADD2-C724186C2C9F'

有人知道吗?

【问题讨论】:

    标签: spring hibernate jpa criteria spring-data


    【解决方案1】:

    最后,这很容易做到。我专注于生成的 sql,而不是用这个不熟悉的 in(*) 多选表达式查看 jpa 查询。所以这行得通:

    private static <T> Predicate appendPublishingChannelIdCondition(Predicate predicate, ExpressionCache<T> cache, CriteriaBuilder cb, CriteriaQuery<?> query, String channelId) {
        Subquery<String> publishingSubquery = query.subquery(String.class);
        Root<PublishingImpl> publishingRoot = publishingSubquery.from(PublishingImpl.class);
        Predicate channelPredicate = cb.equal(publishingRoot.get("channelId"), channelId);
        Subquery<String> assetSetId = publishingSubquery.select(publishingRoot.<String>get("assetSetId")).where(channelPredicate);
        Path attributePath = cache.getAttributePath("assetSet");
        return cb.and(predicate, attributePath.in(assetSetId));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多