获取最小值的 HQL
HQL for getting min
我有以下实体:
Company.class:
public class Company {
@JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "employee_id") )
@ManyToMany(fetch = FetchType.LAZY)
private Set<Employee> employees;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "company")
private List<Score> scores;
@JoinTable(name = "company_factor", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "factor_id") )
@ManyToOne(fetch = FetchType.LAZY)
private Factor factors;
}
和Employee.class
public class Employee {
@ManyToMany(fetch = FetchType.EAGER, mappedBy="employees")
private Set<Company> companies;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "company")
private List<Score> scores;
@JoinTable(name = "employee_factor", joinColumns = @JoinColumn(name = "employee_id") , inverseJoinColumns = @JoinColumn(name = "factor_id") )
@ManyToMany(fetch = FetchType.LAZY)
private Set<Factor> factors;
@Transient
private int score;
}
Factor.class 不包含任何关系。
另外,我有一些实体分数对于公司-员工的每个组合都是唯一的。
它看起来像这样:
Score.class:
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "company_id", insertable = false, updatable = false)
private Company company;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "employee_id", insertable = false, updatable = false)
private Employee employee;
@Column(name = "score")
private BigDecimal score;
如果我得到List,它将是Company和Employee实例的组合列表,有时Company或Employee可以重复。
目标是获取 List,按 Employee 中的 Factor 过滤,并仅显示按升序排列的每个员工的最小分数。
说,如果存在组合
employee1-company1, score=1
employee1-company2, score=2
employee2-company1, score=3
employee2-company4, score=5
employee3-company4, score6
ResultList 应如下所示:
employee1-company1, score=1
employee2-company1, score=3
employee3-company4, score=6
所以员工不应该重复,但公司可以在列表中重复。
我不太确定,该怎么做。我取得的成就是按升序显示独特的结果,但没有显示最低分数。我使用了 HQL:
select distinct e from Score e
left outer join fetch e.company
left outer join fetch e.company.factors
left outer join fetch e.employee
left outer join fetch e.employee.factors ef
where ef.factor_id=:factor_id
group by e.employee.employee_id
order by e.score asc
任何人都可以帮助实现我所需要的吗?谢谢。
更新1:
我决定走另一条路。
现在我通过 Employee 使用此查询获取它:
select distinct e from Employee e join e.scores es order by es.score asc
看来正是我需要的,但是如何在查询中放入最小es.score到Employee
对象的字段分数呢?也许有一些方法可以将 e.score
替换为 es.score
?
您可以使用以下内容:
Select a from (Select b from Score b order by score) as a group by a.employee
解释:
Select b from Score b order by score
:以 score
的 asc(默认)顺序获取结果
根据以上结果分组将给出唯一的员工
作为解决方案,我切换到 entityManager.createNativeQuery("some native sql string")
。
我对结果很满意。就此而言,关于 SQL 查询的问题是 here
唯一的缺点是无法使用join fetch
,所以N+1select的问题就在这里,不过我打算取的数据量比较小,所以还可以接受。
我有以下实体:
Company.class:
public class Company {
@JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "employee_id") )
@ManyToMany(fetch = FetchType.LAZY)
private Set<Employee> employees;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "company")
private List<Score> scores;
@JoinTable(name = "company_factor", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "factor_id") )
@ManyToOne(fetch = FetchType.LAZY)
private Factor factors;
}
和Employee.class
public class Employee {
@ManyToMany(fetch = FetchType.EAGER, mappedBy="employees")
private Set<Company> companies;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "company")
private List<Score> scores;
@JoinTable(name = "employee_factor", joinColumns = @JoinColumn(name = "employee_id") , inverseJoinColumns = @JoinColumn(name = "factor_id") )
@ManyToMany(fetch = FetchType.LAZY)
private Set<Factor> factors;
@Transient
private int score;
}
Factor.class 不包含任何关系。
另外,我有一些实体分数对于公司-员工的每个组合都是唯一的。 它看起来像这样: Score.class:
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "company_id", insertable = false, updatable = false)
private Company company;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "employee_id", insertable = false, updatable = false)
private Employee employee;
@Column(name = "score")
private BigDecimal score;
如果我得到List,它将是Company和Employee实例的组合列表,有时Company或Employee可以重复。 目标是获取 List,按 Employee 中的 Factor 过滤,并仅显示按升序排列的每个员工的最小分数。 说,如果存在组合
employee1-company1, score=1
employee1-company2, score=2
employee2-company1, score=3
employee2-company4, score=5
employee3-company4, score6
ResultList 应如下所示:
employee1-company1, score=1
employee2-company1, score=3
employee3-company4, score=6
所以员工不应该重复,但公司可以在列表中重复。 我不太确定,该怎么做。我取得的成就是按升序显示独特的结果,但没有显示最低分数。我使用了 HQL:
select distinct e from Score e
left outer join fetch e.company
left outer join fetch e.company.factors
left outer join fetch e.employee
left outer join fetch e.employee.factors ef
where ef.factor_id=:factor_id
group by e.employee.employee_id
order by e.score asc
任何人都可以帮助实现我所需要的吗?谢谢。
更新1:
我决定走另一条路。 现在我通过 Employee 使用此查询获取它:
select distinct e from Employee e join e.scores es order by es.score asc
看来正是我需要的,但是如何在查询中放入最小es.score到Employee
对象的字段分数呢?也许有一些方法可以将 e.score
替换为 es.score
?
您可以使用以下内容:
Select a from (Select b from Score b order by score) as a group by a.employee
解释:
Select b from Score b order by score
:以 score 的 asc(默认)顺序获取结果
根据以上结果分组将给出唯一的员工
作为解决方案,我切换到 entityManager.createNativeQuery("some native sql string")
。
我对结果很满意。就此而言,关于 SQL 查询的问题是 here
唯一的缺点是无法使用join fetch
,所以N+1select的问题就在这里,不过我打算取的数据量比较小,所以还可以接受。