【发布时间】:2015-07-22 14:30:16
【问题描述】:
我有三个表Job、JobSeeker 和Job_applications,这是中间表。 Job 和 JobSeeker 之间的关系是 n 到 n。如何编写休眠查询或条件来选择具有Job.id 和Job.applicantsCount 的列表(作业),该列表计算有多少JobSeeker 应用于该作业。
Job实体:
@ManyToMany
@JoinTable(name="JOB_APPLICATIONS",
joinColumns={@JoinColumn(name="id_job", referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="id_job_seeker", referencedColumnName="id")})
private List<JobSeeker> jobSeekers = new ArrayList<JobSeeker>();
@Transient
@Expose
private Integer applicantsCount = 0;
...
JobSeeker实体:
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="JOB_APPLICATIONS",
joinColumns={@JoinColumn(name="id_job_seeker", referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="id_job", referencedColumnName="id")})
@Fetch(FetchMode.SUBSELECT)
private List<Job> jobs = new ArrayList<Job>();
....
在普通 SQL 中,我会这样写:select id,(select count(*) from job_applications where id_job = id ) as applicantsCount from job
这可行,但我需要它与 List(Job) 中的 hibernate.Query 或 hibernate.Criteria 一起使用。有人可以帮我用hibernate写这个查询吗?
解决方案: manish评论解决了我的问题阅读它
【问题讨论】:
-
如果您愿意使用特定于 Hibernate 的代码,您可以直接在实体类中执行此操作。首先从
applicantsCount字段中删除@Transient。然后,输入@Basic @Formula("(SELECT COUNT(*) FROM job_applications WHERE id_job=id)")获取字段值。请注意包含查询的(),它应该可以防止 Hibernate 生成的查询出现乱码。然后,job.getApplicantsCount()应该会告诉您该职位的申请人数。您可以通过@Basic注释的属性延迟加载此计数。 -
Oao 不错的答案,它工作正常。我不知道这个@Formula 注释。谢谢!
标签: java hibernate hibernate-criteria