两个以上实体的Hibernate复杂查询



我试图使hibernate查询搜索和过滤我的实体,但我找不到任何解决方案。我有三个有界的实体

组实体

public class Group  {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;

@Column
private String name;

@EqualsAndHashCode.Exclude 
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(
name="students_groups",
joinColumns=@JoinColumn(name="group_id"),
inverseJoinColumns=@JoinColumn(name="student_id")
)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Student> students; 
}
学生实体

public class Student  {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;

@Column(name="personal_number")
private int personalNumber;

@Column(name="first_name")
private String firstName;

@Column(name="last_name")
private String lastName;

@Column
private LocalDate birthday;

@Column
private String email;

@Enumerated(EnumType.STRING)
@Column(columnDefinition="enum('MALE','FEMALE')")
private Gender gender;

@Column
private String address;

@EqualsAndHashCode.Exclude 
@OneToMany( cascade={CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(
name="students_courses",
joinColumns=@JoinColumn(name="student_id"),
inverseJoinColumns=@JoinColumn(name="course_id")
)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Course> courses;

public Student(int id) {
this.id = id;
}
public String getGender() {
if(gender==null)
gender = Gender.valueOf("MALE");
return gender.toString();
}
public void setGender(String gender) {
if(gender==null)
gender = "MALE";
this.gender = Gender.valueOf(gender);
}
}

和课程实体


public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;

@Column
private String name;

@Column
private String description;
}

我需要一个组一个组地找。当然了。id我试着做这样的查询

Query<Group> query = session.createQuery("from Group as g join g.students as s join s.courses as c where c.id like :courseId and g.id like :groupId", Group.class);

但是它不起作用:(我将非常感谢你帮助我解决这个问题,并为我的糟糕英语感到抱歉:)

试着用这种方式纠正你的查询:

Query<Group> query = session.createQuery("select g from Group g join g.students s join s.courses c where c.id = :courseId and g.id = :groupId", Group.class);

请注意:

  1. 您只能对string_expression使用like谓词。

  2. TRUEFALSE值不推荐用于@LazyCollection,因为您应该使用@ElementCollection,@OneToMany@ManyToMany集合的JPAFetchType属性。

最新更新