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
Jpa 条件查询选择联接_Jpa_Eclipselink_Jpql_Criteria Api - Fatal编程技术网

Jpa 条件查询选择联接

Jpa 条件查询选择联接,jpa,eclipselink,jpql,criteria-api,Jpa,Eclipselink,Jpql,Criteria Api,我需要帮助在条件查询中转换此JPQL查询: SELECT u.documentList FROM Unit u WHERE u.id = :id 这就是我尝试过的: CriteriaQuery<Document> query = builder.createQuery(Document.class); Root<Unit> root = query.from(Unit.class); Join<Unit, Document> join = root.join

我需要帮助在条件查询中转换此JPQL查询:

SELECT u.documentList FROM Unit u WHERE u.id = :id
这就是我尝试过的:

CriteriaQuery<Document> query = builder.createQuery(Document.class);
Root<Unit> root = query.from(Unit.class);
Join<Unit, Document> join = root.join(Unit_.documentList);
query.select(join);
query.where(builder.equal(root.get(AbstractEntity_.id), entity.getId()));
以下是映射:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Unit extends NamedEntity
{
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "DOCUMENT_RELATION", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    protected List<Document> documentList = new ArrayList<>();
}

找到的解决方案:

CriteriaQuery<Document> query = builder.createQuery(Document.class);

Root<Unit> root = query.from(Unit.class);
root.alias("root");

Root<Document> relation = query.from(Document.class);
relation.alias("relation");

query.select(relation);

query.where
(
    builder.equal(root.get(AbstractEntity_.id), item.getId()),
    builder.isMember(relation, root.get(Unit_.actionList))
);
CriteriaQuery=builder.createQuery(Document.class);
Root=query.from(Unit.class);
root.别名(“root”);
根关系=query.from(Document.class);
关系。别名(“关系”);
查询、选择(关系);
请问,在哪里
(
builder.equal(root.get(AbstractEntity.id),item.getId()),
builder.isMember(关系,根.get(单元\操作列表))
);

JPA规范禁止您尝试实现的内容。单值路径表达式在select子句中有效,但集合值路径表达式无效。见规范第4.8章。我引用了专业JPA书籍:

以下查询是非法的: 选择d.employees 来自d部门

这同样适用于条件查询。为什么不直接查询
单元
并调用
getDocumentList()

编辑: 您还可以尝试反向查询:

SELECT d FROM Document d WHERE d.unit.id=:id

谢谢,我将检查规范。我尝试这样做是因为我需要通过JSF/PrimeFaces启用对关系集合的分页、过滤和排序。其中一些集合可能包含数千个元素,因此这也是一个性能问题。谢谢,我找到了解决方法:
SELECT d FROM Unit u,Document d WHERE d member of u.documentList
CriteriaQuery<Document> query = builder.createQuery(Document.class);

Root<Unit> root = query.from(Unit.class);
root.alias("root");

Root<Document> relation = query.from(Document.class);
relation.alias("relation");

query.select(relation);

query.where
(
    builder.equal(root.get(AbstractEntity_.id), item.getId()),
    builder.isMember(relation, root.get(Unit_.actionList))
);
SELECT d FROM Document d WHERE d.unit.id=:id