gpt4 book ai didi

java - 使用 Spring JPA 访问多个实体连接查询结果集

转载 作者:行者123 更新时间:2023-11-30 08:38:39 25 4
gpt4 key购买 nike

我有以下 2 个实体类 1.student 2.resluts,我必须通过执行以下自定义查询来返回结果集

 select s.roll_no , s.first_name, s.age ,r.subject_name , r.marks from student s , results r where s.roll_no= : rollNo and r.marks >70

它给出了结合了学生和结果实体的结果集。在这种情况下,我该如何编写我的实现。我尝试了以下两种方法

方法一:

public interface GetStudentDetail extends CrudRepository<Student, String> {
@Transactional(readOnly=true)
@Query("select s.roll_no , s.first_name, s.age ,r.subject_name , r.marks from student s , results r where s.roll_no= : rollNo and r.marks >70")
public List<student> getStudentDetails(@Param("rollNo")String rollNo);
}

通过上面的代码,我只能从结果集中获取学生实体值,而结果实体对象在此处不​​可见。

方法二:

public interface GetStudentDetail extends CrudRepository<Student, String> {
@Transactional(readOnly=true)
@Query("select s.roll_no , s.first_name, s.age ,r.subject_name , r.marks from student s , results r where s.roll_no= : rollNo and r.marks >70")
public List<Object[]> getStudentDetails(@Param("rollNo")String rollNo);
}

这样,我又创建了一个包含实体变量的 VO 类,并且我通过访问它的位置来手动设置这些对象,如下所示

List<StudentResultVo>studtVoObjList = new ArrayList<StudentResultVo>();
for (Object[] resObj : resultSetList) {
StudentResultVo studtVO = new StudentResultVo();
if (resObj[0] != null) {
studtVO.setRollNo(resObj[0].toString().trim());
}
//.First name
//.Age

if (resObj[3] != null) {
studtVO.setSubName(resObj[3].toString().trim());
}
//.Marks
studtVoObjList.add(studtVO);
}

我知道上述方法不是好的编码习惯。有什么办法可以解决这个问题。

谢谢。

最佳答案

首先创建新的接口(interface)并声明你的方法

public interface GetStudentDetailCustom {
public List<Object[]> getStudentDetails(String rollNo);
}

然后创建类 GetStudentDetailImpl 并实现接口(interface)

public class GetStudentDetailImpl implements GetStudentDetailCustom {

@PersistenceContext
private EntityManager entitymanager; // I use entity manager also you want to use inject SessionFactory etc..

@Override
public List<Object[]> getStudentDetails(String rollNo) {
String queryString = "SELECT s.roll_no , s.first_name, s.age ,r.subject_name , r.marks FROM student s "
+ ", results r WHERE s.roll_no= :rollNo and r.marks > 70";

Query query = entitymanager.createQuery(queryString);
query.setParameter("rollNo", rollNo);

return query.getResultList();
}

}

像这样重构你的仓库

public interface GetStudentDetail extends CrudRepository<Student, String>, GetStudentDetailCustom  {}

最后在您的服务类中使用注入(inject) GetStudentDetail 并调用 getStudentDetails 方法

服务层中的示例使用:

@Autowired
private GetStudentDetail getStudentDetail;

getStudentDetail.getStudentDetails(String rollNo);

引用答案:How to add custom method to Spring Data JPA

和 Spring 引用:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour

关于java - 使用 Spring JPA 访问多个实体连接查询结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com