java - Spring Hibernate 多对多关联与 transient 值

标签 java spring hibernate spring-data-jpa many-to-many

我有两个表教师和学生

Teacher(Teacher_id, Teacher_name)
Student(student_id, student_name)
Teacher_Student(id, Teacher_id, Student_id)

每个表都有相应的模型,例如 Teacher.java Student.java 和 TeacherStudent.java

我希望能够获得包含教师信息列表和每位教师的学生人数的结果集。例如:

Teacher_id, Teacher_name, No_of_students

我不想获取教师列表,然后循环遍历每个教师 ID 并查找学生人数。

我有一个 SQL 查询,可以在一个查询中执行此操作,但是如何在 hibernate 上执行此操作。另外,我希望 No_of_Students 值是暂时的。

最佳答案

不需要两个查询,您只需使用即可:

Query query = em.createQuery("SELECT t.id, t.name, t.listStudent.size() FROM Teacher");

这将返回一个对象数组的列表,如下所示:

List<Object[]> result = query.getResultList();

要获取您可以使用的信息:

List<Teacher> listTeachers = new ArrayList<>();
for(Object[] info : result){
    listTeachers.add(
       new Teacher(
          (Long) info[0],   // the id
          (String) info[1], // the name
          (Long) info[2]    // the number of students
       )
   );
}

我假设在您的教师实体中您有一个构造函数:

public Teacher(String id, String name, Long nbrStudent){
   this.id = id;
   this.name = name;
   this.nbrStudent = this.listStudent.size();
}

和一个@Transient变量:

@Transient
private @Getter @Setter Long nbrStudent;
<小时/>

或者一步到位:

Query query = em.createQuery(
        "SELECT com.namepackage.Teacher(t.id, t.name, t.listStudent.size()) FROM Teacher"
);
List<Teacher> result = query.getResultList();

请注意,我使用了com.namepackage.Teacher(t.id, t.name, t.listStudent.size())

关于java - Spring Hibernate 多对多关联与 transient 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50122073/

相关文章:

java - 来自方法的包装/代理样板

java - 加载驱动类 com.mysql.jdbc.Driver 失败

java - 如何使用 Spring Boot 提供不同的数据库配置?

Spring 集成单元测试出站 channel 适配器

hibernate - Grails 级联删除

java - HTTP 状态 400 – 错误请求 - Hibernate

java - Mockito:以不同的方法覆盖模拟值

java - 可选打印 Java 中的堆栈跟踪

java - @EnableSpringConfigured 导入

hibernate - Grails 在运行时更改数据源