大多数时候,当我们使用 jpa 查询时,获得的结果会映射到对象/特定数据类型。但是当我们在查询中使用聚合函数时,处理结果有时需要我们自定义 jpa 查询。
让我们通过一个例子来理解(部门,员工)−
dept.java@entitypublic class dept { @id private long id; private string name; @onetomany(mappedby = dep) private list<employee> emp; //getters //setters}
一个部门可以有一名或多名员工,但一名员工只能属于一个部门。
员工.java@entitypublic class employee { @id private long id; private integer joiningyear; @manytoone private dept dep; //getters //setters}
现在,如果我们想获取入职日期以及按入职日期分组的员工人数,
@repositorypublic interface employeerepository extends jparepository<employee, long> { // query methods @query(select e.joiningyear, count(e.joiningyear) from employee as e group by e.joiningyear) list<object[]> countemployeesbyjoiningyear();}
上述查询可以正常工作,但是以list<object[]>的方式存储值可能会导致错误。相反,我们可以自定义jpa查询,将上述查询的结果映射到一个java类中。这个java类只是一个简单的pojo(plain old java object),不需要用@entity进行注解。
countemployees.java 的中文翻译为:countemployees.javapackage com.tutorialspoint;public class countemployees { private integer joinyear; private long totalemp; public countemployees(integer joinyear, long totalemp) { this.joinyear = joinyear; this.totalemp = totalemp; } //getters //setters}
现在,我们可以自定义我们的jpa查询,如下所示−
@query(select new com.tutorialspoint.countemployees(e.joiningyear, count(e.joiningyear)) + from employee as e group by e.joiningyear)list<countemployees> countemployeesbyjoining();
上述选择查询的结果将映射到 countemployees 类。通过这种方式,我们可以自定义 jpa 查询并将结果映射到 java 类。
以上就是如何使用聚合函数自定义jpa查询的结果?的详细内容。