【问题标题】:Spring Hibernate Many-to-Many Association with transient valueSpring Hibernate 与瞬态值的多对多关联
【发布时间】:2018-05-01 18:46:07
【问题描述】:

我有两张表教师和学生

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

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

我希望能够获得一个包含教师信息列表和每位教师 no_of_students 的结果集。例如:

Teacher_id, Teacher_name, No_of_students

我不想得到一个教师列表,然后遍历每个教师 ID 并找到学生的数量。

我有一个在一个查询中执行此操作的 SQL 查询,但是如何在休眠状态下进行此操作。我还希望 No_of_Students 值是瞬态的。

【问题讨论】:

  • but how do I make this work on hibernate 是什么意思
  • 我的意思是说不必做两次查询,即第一次查询获取教师列表,然后通过每个teacher_id获取no_of_students。我在模型中使用 NamedQuery。那么这个查询应该驻留在哪个模型中呢?

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


【解决方案1】:

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

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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多