Java 休眠条件如何不加载子项
你好,我有三个实体:用户、应聘者(求职者)和面试。我想加载与候选人的面试,但与候选人它加载用户。我试图从注释中解析lazy与求职者的用户关系,但当我想加载一个求职者时,用户不会给出代理会话。我想我必须从标准上解决这个问题 我的采访对象: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)
@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无法初始化代理?是的,我理解,但是我在解决方案更新中是如何工作的,我不想加载用户或完整的候选对象,只想加载候选名称,这对我来说已经足够了:)