您好,我有三个实体用户,候选人(求职者)和面试。我想加载与候选人的面试,但与候选人一起加载用户。我试图从将懒惰变为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/