Я искал эту проблему и застрял в течение последних нескольких дней, поэтому я надеюсь, что вы можете помочь. Я попытаюсь обобщить проблему, с которой я столкнулся, с помощью базовой c концепции, потому что тогда я могу просто применить ее к моей более сложной проблеме.
У меня есть 2 объекта сущности: Студент и Курс. Обратите внимание, что объект «студент» создает таблицу с 3 столбцами и имеет дополнительное свойство для «количество». Идея здесь в том, что я не хочу сохранять агрегат, который я буду выполнять при выполнении своего запроса. Таким образом, студент покупает несколько курсов, и каждый курс имеет свою стоимость. Я хочу суммировать общую стоимость так, чтобы она была на том же уровне в json (см. Желаемый результат).
Я застрял в моем запросе выбора. Все работает, когда удаляю a.course. Мой json показывает совокупность и все хорошо. Но, конечно, список отсутствует. Итак, мой общий вопрос: как должен выглядеть мой запрос выбора, если в мой запрос встроен объект вложенного списка?
select new Student(a.id, a.name, a.course,
Желаемый результат:
{
"id": 1,
"name": "Billy"
"course":
{[
"id" : 1,
"courseName" : "Math",
"cost" : 12.99
],[
"id" : 2,
"courseName" : "Science",
"cost" : 15.99
]
}
"amount" : 28.98
}
public class Student {
@Id
@GeneratedValue(
strategy= GenerationType.AUTO,
generator="PRIVATE_SEQ"
)
@GenericGenerator(
name = "native",
strategy = "native"
)
private long id;
@Column(name = "name", nullable = false, length = 25)
private String name;
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name="student_id")
private List<Course> course;
private BigDecimal amount;
public Student(Long id, String name, List<Course> course, BigDecimal amount) {
this.id = id;
this.name = name;
this.course = course;
this.amount = amount;
}
}
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(
strategy= GenerationType.AUTO,
generator="PRIVATE_SEQ"
)
@GenericGenerator(
name = "native",
strategy = "native"
)
private long id;
@Column(name = "coursename", nullable = false, length = 30)
private String courseName;
@ManyToOne
@JoinColumn(name="student_id")
private Student student;
@Column(name = "cost", nullable = false)
private BigDecimal cost;
public Course(Long id, String courseName, BigDecimal cost) {
this.id = id;
this.courseName = courseName;
this.cost = cost;
}
List<Student> students = session
.createQuery(" select new Student(a.id, a.name, a.course, SUM(CASE WHEN b.cost <> 0 THEN b.cost ELSE 0 END)) from Student a "
+ "Left join fetch Course b on b.id = d.budget "
+ "group by b.id ")
.getResultList();