【发布时间】:2020-10-26 17:30:26
【问题描述】:
我已经搜索了很多,但无法让它工作。 我也发现了这个,它很接近,但它需要不必要的连接并且不能忽略区分大小写:Criteria API not in @ElementCollection
这是简化的实体:
@Entity(name = "Users")
public class User {
@Id
@Column(columnDefinition = "TEXT")
private String id;
@ElementCollection
@LazyCollection(LazyCollectionOption.FALSE)
private List<String> communities;
}
jpa/hibernate 魔法将其转换为两个表:users(text id) 和 users_communities(text id, text community)
我想映射到条件的普通 sql 语句是:
select u.id from users u
where u.users_id not in (
select uc.users_id
from users_communities uc
where lower(communities) = 'test_user_app'
);
这是我当前的 java 代码。如何在 subJoin 上使用“criteriaBuilder.lower()”?没有更简单的方法吗?是不是可以避免手动subJoin?
Subquery<String> subquery = criteria.subquery(String.class);
Root<User> subRoot = subquery.from(User.class);
Join<Object, Object> subJoin = subRoot.join("communities");
subquery.select(subRoot.get("id"));
subquery.where(criteriaBuilder.equal(root.get("id"), subRoot.get("id")), subJoin.in("community_to_find"));
return criteriaBuilder.exists(subquery);
【问题讨论】:
标签: java hibernate jpa criteria-api