正如标题所示,我的存储库中有一个本机 SQL 查询,如下所示
@Repository
public interface BesoinRepository extends CrudRepository<Statistic, Long>{
@Query(value="SELECT etat_besoin AS 'state',COUNT(DISTINCT id) AS 'number' FROM besoin WHERE YEAR(date_creation)=:year GROUP BY etat_besoin ",nativeQuery=true)
List<Object> getStatistic(@Param("year") int year);
}
班级统计
package fr.solinum.management.model;
public class Statistic {
private String state;
private int number;
public String getState() {
return state;
}
public int getNumber() {
return number;
}
}
这工作正常,但我想要的返回类型getStatistic
to be List<Statistic>
并且没有在我的数据库中创建表统计,因为我不需要它。换句话说,我只想从数据库中读取并将结果作为类返回。那么模型、存储库或控制器中有哪些变化,或者解决我的问题的最佳方法是什么?请注意,我如下修改了我的模型类来解决这个问题,但我不认为这是最佳或好的方法。
package fr.solinum.management.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "besoin")
public class Statistic {
@Id
private int id;
private String state;
private int number;
public String getState() {
return state;
}
public int getNumber() {
return number;
}
}
我可以想到三种方法:
- 使用数据库视图。
这样,您就可以将实体像任何其他表一样映射到视图。您可以毫无问题地使用存储库,并且无需创建不同的表。
- 将您的列表映射到类中并从服务/DAO 访问此数据。
这是更加劳动密集型的,并且可能不“适合”您的代码的其余部分。您可以使用另一个类,而不是直接使用存储库。此类将查询对象并映射它们,然后将它们传递到请求它们的控制器或服务。这真的就像做 JPA 的工作一样。
以下面的代码为例:
@Component
public class StatisticDAO {
@Autowired
private BesoinRepository besoinRepository;
public List<Statistic> getStatistic(int year) {
List<Statistic> result = new ArrayList<>();
List<Object[]> temp = besoinRepository.getStatistic(year);
temp.stream().forEach(data -> result.add(build(data)));
return result;
}
private Statistic build(Object[] data) {
return new Statistic(String.valueOf(data[0]), (Integer)data[1]);
}
}
您需要将列表的类型更改为 Object[] 并检查 JPA 返回属性的顺序。
- Use 基于界面的投影 https://www.baeldung.com/spring-data-jpa-projections.
我推荐方法 1 和 3,但这取决于您以及更适合您的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)