当我们前端需要显示列表时,若需要显示关联表中的某个字段,如:显示学生列表,需要把学生所在的班级名称也显示,一种方法是建个对象,另一种方式把查出来的值放入Map对象中(也可以放入数组或List)。实体如下:
@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Student implements Serializable {
private Long id;
private String sno;
private ClassInfo classInfo;
private String sname;
private int sex = 1;
@DateTimeFormat(iso=ISO.DATE)
private Date birthday;
private String loves;
private String[] lovesTemp;
private String studentDesc;
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SeqName")
@SequenceGenerator(name="SeqName", sequenceName="SEQ_STUDENT", allocationSize=1)
public Long getId() {
return id;
}
@ManyToOne
@JoinColumn(name="CID")
public ClassInfo getClassInfo() {
return classInfo;
}
@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Student implements Serializable {
private Long id;
private String sno;
private ClassInfo classInfo;
private String sname;
private int sex = 1;
@DateTimeFormat(iso=ISO.DATE)
private Date birthday;
private String loves;
private String[] lovesTemp;
private String studentDesc;
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SeqName")
@SequenceGenerator(name="SeqName", sequenceName="SEQ_STUDENT", allocationSize=1)
public Long getId() {
return id;
}
@ManyToOne
@JoinColumn(name="CID")
public ClassInfo getClassInfo() {
return classInfo;
}
@Entity
public class ClassInfo implements Serializable {
private Long id;
private String cname;
private int count = 0;
@OneToMany(mappedBy="classInfo", fetch = FetchType.LAZY)
public Set<Student> getStudents() {
return students;
}
@Entity
public class ClassInfo implements Serializable {
private Long id;
private String cname;
private int count = 0;
@OneToMany(mappedBy="classInfo", fetch = FetchType.LAZY)
public Set<Student> getStudents() {
return students;
}
当HQL是:from Student s join fetch s.classInfo,这条语句会把Student和ClassInfo两个实体的字段全部查出,当需要Student中的某个字段,可以构造一个构造方法,但是用fetch语句就老报错,不用fetch的话,就会每个Student对象再查询ClassInfo对象,造成了N+1次查询。所以后来就想到了用Map对象来封装,HQL语句如下:
select new Map(s.id as id,s.sno as sno, s.classInfo.cname as cname,s.sname as sname,s.birthday as birthday) from Student s ,用这句就查出的列表信息就是按需查找,班级也只要班级名称,不过也可以新建个对象,把这些查出的值放入新建的对象中(也可以用数组或select new List),不知道各位大侠对这种情况下怎么处理的?
|