将jpa查询转换为谓词的spring-data规范

时间:2014-06-13 15:37:36

标签: spring hibernate jpa criteria spring-data

我需要将这个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'

有人有线索吗?

1 个答案:

答案 0 :(得分:1)

最后这很容易做到。我专注于生成的sql,而不是在(*)多选表达式中使用这个不熟悉的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));
}