Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:多个值匹配多个值_Java_Jpa - Fatal编程技术网

Java 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

如何通过多个值匹配多个值?(所有比赛)

对于以下示例,如果提供了标记,查询将返回所有标记匹配的所有文档。在JPA中如何做到这一点?谢谢

数据:

场景:

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