Java 休眠条件如何不加载子项

Java 休眠条件如何不加载子项,java,hibernate,hibernate-mapping,hibernate-criteria,Java,Hibernate,Hibernate Mapping,Hibernate Criteria,你好,我有三个实体:用户、应聘者(求职者)和面试。我想加载与候选人的面试,但与候选人它加载用户。我试图从注释中解析lazy与求职者的用户关系,但当我想加载一个求职者时,用户不会给出代理会话。我想我必须从标准上解决这个问题 我的采访对象: @Entity @Table(name = "INTERVIEW") public class Interview extends BaseEntity { @ManyToOne(fetch=FetchType.EAGER)

你好,我有三个实体:用户、应聘者(求职者)和面试。我想加载与候选人的面试,但与候选人它加载用户。我试图从注释中解析lazy与求职者的用户关系,但当我想加载一个求职者时,用户不会给出代理会话。我想我必须从标准上解决这个问题

我的采访对象:

    @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;
    .
    .
    .
求职者实体:

    @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;
    .
    .
    .
用户实体:

    @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次查询,当我将lazy放入求职者中时,用户编写了1次查询,但我不能将lazy放入其中。我在stackoverlow上搜索了一下,看到了像这样的延迟加载

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

但它对我不起作用,它还写了一个查询。我是否可以在条件中告诉jobSeeker不要加载用户子级,或者告诉lazy加载用户的其他选项

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

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、状态、日期和候选人姓名。简单的别名ToBeanTransformer不适用于候选者。name和我发现了一个不错的transformer witch。链接:


此外,您还可以设置此条件之外的投影

您好,这对我不起作用,它使用.createAlias(“candidate.user”,JoinType.NONE)创建了更多查询;现在我正在阅读预测,希望它能解决我的问题。。当我使用createCriteria而不是CreateAlias时,它对我起了作用。我尝试使用criteria,但结果是一样的,也谢谢你的回答。你知道,当你使用lazyness时,错误是因为你试图在会话之外访问Hibernate代理,所以Hibernate无法初始化代理?是的,我理解,但是我在解决方案更新中是如何工作的,我不想加载用户或完整的候选对象,只想加载候选名称,这对我来说已经足够了:)