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 CriteriaBuilder联接不适用于集合_Jpa - Fatal编程技术网

JPA CriteriaBuilder联接不适用于集合

JPA CriteriaBuilder联接不适用于集合,jpa,Jpa,我有两个实体,一对多的关系。我正试图加入实体集合,但却不知道如何使用该框架。我总是使用hibernate的DetachedCriteria,但对我来说已经不是一个选项了,任何帮助都会很好 @Entity @Table(name = "Project") public class Project implements Serializable { .... @OneToMany(cascade = CascadeType.ALL, mappedBy = "project") pri

我有两个实体,一对多的关系。我正试图加入实体集合,但却不知道如何使用该框架。我总是使用hibernate的DetachedCriteria,但对我来说已经不是一个选项了,任何帮助都会很好

@Entity
@Table(name = "Project")
public class Project implements Serializable {
....
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "project")
    private Collection<WorkReport> workReportCollection;
....


@Data
@Entity
@Table(name = "work_report")
public class WorkReport implements Serializable {
    @JoinColumn(name = "id_work_report", referencedColumnName = "id_work_report", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Project project;
@实体
@表(name=“项目”)
公共类项目实现可序列化{
....
@OneToMany(cascade=CascadeType.ALL,mappedBy=“项目”)
私人收藏;
....
@资料
@实体
@表(name=“工作报告”)
公共类WorkReport实现可序列化{
@JoinColumn(name=“id\u work\u report”,referencedColumnName=“id\u work\u report”,insertable=false,updateable=false)
@多通(可选=假)
私人项目;
我正试图像这样加入workReportCollection,但它总是抛出

LazyInit异常

当访问字段时

CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Project> query = builder.createQuery(Project.class);
        Root<Project> project = query.from(Project.class);
        Predicate idPredicate = builder.equal(project.get("idProject"), idProject);
        project.joinCollection("workReportCollection",  JoinType.LEFT);
        query.where(idPredicate);
        TypedQuery<Project> q = em.createQuery(query);
        return q.getSingleResult();
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Project.class);
根项目=query.from(project.class);
谓词idPredicate=builder.equal(project.get(“idProject”),idProject);
项目.joinCollection(“workReportCollection”,JoinType.LEFT);
查询。其中(idPredicate);
TypedQuery q=em.createQuery(查询);
返回q.getSingleResult();
唯一有效的方法是使用fetch而不是join,但它也会获取所有其他关联,这太多了


如何使用JPA CriteriaBuilder正确地编写联接?或者我应该使用带投影的获取吗?

联接是正确的,但在访问集合时集合未初始化,这就是为什么会出现LazyInitException

您必须添加获取:

project.fetch("workReportCollection");

建议JPA在查询后初始化集合。

hmm我已经使用了fetch,但我不知道两者之间的区别,所以我选择了join。或者我应该将join与fetch一起使用?那么join的意义是什么?你应该阅读文档来检查区别