您好,我有三个实体用户,候选人(求职者)和面试。我想加载与候选人的面试,但与候选人一起加载用户。我试图从将懒惰变为Jobeeker与用户的关系的注释中解决,它可以工作,但是当我想用用户加载JobSeeker时,没有提供代理会话。我认为我必须以某种方式解决这些标准。

我的面试单位:

    @Entity
    @Table(name = "INTERVIEW")
    public class Interview extends BaseEntity {

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "job_id", nullable=false)
    @Expose
    @NotNull
    private Job job;

    /** candidates for interview */
    @ManyToOne
    @JoinColumn(name = "job_seeker_id", nullable=false)
    @Expose
    @NotNull
    private JobSeeker candidate;
    .
    .
    .


JobSeeker实体:

    @Entity
    @Table(name="JOB_SEEKER")
    public class JobSeeker extends BaseEntity{

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
    .
    .
    .


用户实体:

    @Entity
    @Table(name="USER_AUTH")
    public class User extends BaseEntity {

    @OneToOne(mappedBy = "user", cascade=CascadeType.ALL)
    private JobSeeker jobSeeker;
    .
    .
    .


以及标准:

Session session = getCurrentSession();
Criteria criteria = session
    .createCriteria(Interview.class, "interview")
    .setFirstResult(dataTableFilter.iDisplayStart)
    .setMaxResults(dataTableFilter.iDisplayLength)
    .createAlias("interview.candidate", "candidate");


现在它正在工作,但是由于用户的原因,n次面试使n次查询,当我将懒惰放入Jobeeker中时,用户写了1条查询,但我不能在那儿放置懒惰。我在stackoverlow上搜索,我看到像

.setFetchMode("candidate.user", FetchMode.SELECT)


要么

.setFetchMode("candidate.user", FetchMode.LAZY)


但它对我没有用,它还会编写n查询。我能以某种方式告诉标准不要用jobSeeker加载用户子级,还是用其他方式延迟加载用户?

解:
通过投影,我现在解决了我的标准如下所示:

Criteria criteria = session
        .createCriteria(Interview.class, "interview")
        .setFirstResult(dataTableFilter.iDisplayStart)
        .setMaxResults(dataTableFilter.iDisplayLength)
        .createAlias("interview.job", "job")
        .createAlias("interview.candidate", "candidate"))
        .setProjection(Projections.projectionList()
                .add(Projections.property("id"), "id")
                .add(Projections.property("status"), "status")
                .add(Projections.property("date"), "date")
                .add(Projections.property("candidate.name"), "candidate.name"))
                    .setResultTransformer(new AliasToBeanNestedResultTransformer(Interview.class));


现在仅选择面试ID,状态,日期和候选人姓名。简单的AliasToBeanTransformer不适用于候选人。我发现一个不错的变形金刚作品。链接:https://github.com/samiandoni/AliasToBeanNestedResultTransformer

最佳答案

Session session = getCurrentSession();

Criteria criteria = session
.createCriteria(Interview.class, "interview")
.setFirstResult(dataTableFilter.iDisplayStart)
.setMaxResults(dataTableFilter.iDisplayLength)
.createAlias("interview.candidate", "candidate")
.createAlias("candidate.user",  JoinType.NONE);


此外,您还可以为此设置其他投影

关于java - hibernate 准则如何不给 child 装 child ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31717509/

10-12 05:45