Java JPA:多个值匹配多个值
如何通过多个值匹配多个值?(所有比赛) 对于以下示例,如果提供了标记,查询将返回所有标记匹配的所有文档。在JPA中如何做到这一点?谢谢 数据: 场景:Java JPA:多个值匹配多个值,java,jpa,Java,Jpa,如何通过多个值匹配多个值?(所有比赛) 对于以下示例,如果提供了标记,查询将返回所有标记匹配的所有文档。在JPA中如何做到这一点?谢谢 数据: 场景: Criteria: "tag1", "tag2" => Return: "doc1" Criteria: "tag1", "tag2", "tag3" => Return: Nothing Criteria: "tag2" => Return: "doc1" and "doc2" 实体: 公共类文档{ @身份证 私人长id
Criteria: "tag1", "tag2"
=> Return: "doc1"
Criteria: "tag1", "tag2", "tag3"
=> Return: Nothing
Criteria: "tag2"
=> Return: "doc1" and "doc2"
实体:
公共类文档{
@身份证
私人长id;
@纵队
私有字符串名称;
@许多
@JoinTable(name=“DOCUMENT\u TAG\u RLAT”)
私有列表标签;
}
公共类标签{
@身份证
私人长id;
@纵队
私有字符串名称;
}
我不知道完美的解决方案,但这会奏效:
public List<Document> documentsByTags(List<String> tagNames) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Document> criteriaQuery = criteriaBuilder.createQuery(Document.class);
Root<Document> documents = criteriaQuery.from(Document.class);
List<Predicate> predicates = new ArrayList<Predicate>();
for (String tagName : tagNames) {
Subquery<Long> sq = criteriaQuery.subquery(Long.class);
Root<Tag> tags = sq.from(Tag.class);
sq.select(tags.<Long>get("documents")).where(
criteriaBuilder.equal(tags.get("name"), tagName);
predicates.add(criteriaBuilder.in(documents.<Long> get("id")).value(sq));
}
criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
TypedQuery<Document> query = entityManager.createQuery(criteriaQuery);
return query.getResultList();
}
公共列表文档ByTags(列表标记名){
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(Document.class);
根文档=criteriaQuery.from(Document.class);
列表谓词=新的ArrayList();
for(字符串标记名:标记名){
Subquery sq=criteriaQuery.Subquery(Long.class);
根标记=sq.from(标记类);
sq.select(tags.get(“文档”))。其中(
criteriaBuilder.equal(tags.get(“name”),标记名);
add(criteriaBuilder.in(documents.get(“id”)).value(sq));
}
where(predicates.toArray(新谓词[predicates.size()]);
TypedQuery=entityManager.createQuery(criteriaQuery);
返回query.getResultList();
}
另外,我认为您需要双向关系
@manytomy
(在文档的标记.class
属性上没有看到,可能您只是没有粘贴),并且在您的@JoinTable
注释中,您必须指定joinColumns和inverseJoinColumns。@paulek我没有尝试您的解决方案,但我想到了一个有效的解决方案
select d from Document d
where
(select count(t) from d.tags as t, Tag t2 where t.id = t2.id and t2 in (:tags))
=
:tagCount
select d from Document d
where
(select count(t) from d.tags as t, Tag t2 where t.id = t2.id and t2 in (:tags))
=
:tagCount