【问题标题】:How can I select with hibernate.query from an intermediate table如何从中间表中使用 hibernate.query 进行选择
【发布时间】:2015-07-22 14:30:16
【问题描述】:

我有三个表JobJobSeekerJob_applications,这是中间表。 JobJobSeeker 之间的关系是 n 到 n。如何编写休眠查询或条件来选择具有Job.idJob.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


【解决方案1】:

不是很清楚。您应该编写实体以提供更好的抽象。为什么你不能在Job 类中有一个List&lt;JobApplications&gt;,这样你就可以得到一个列表:

Criteria crit = s.createCriteria(Job.class);
List<Job> jobs =crit.getList();
for(Job j:jobs){
    //j.getId returns the Id of the Job.....and... 
    //j.getJobApplications.size() returns count for that particular job
}

【讨论】:

  • 我也有过这样的情况,但是每个作业都进行查询很难看,我想要一个查询。
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多