1
其映射到DTO的时候我有一个实体,称为学生实体中获取集合使用变形金刚
@Entity
@Table(name = "students")
public class Student implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "STUDENT_ID")
private Integer studentId;
@Column(name = "STUDENT_NAME", nullable = false, length = 100)
private String studentName;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "student", cascade = CascadeType.ALL)
private List<Note> studentNotes;
// Some other instance variables that are not relevant to this question
/* Getters and Setters */
}
,并称为注意
@Entity
@Table(name = "notes")
public class Note implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "NOTE_ID")
private Integer noteId;
@Column(name = "NOTE_CONTENT")
private String noteText;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "STUDENT_ID")
private Student student;
/* Getters and Setters */
}
实体正如你所看到的关系决定了一个学生可以有多个音符。
为了在特定页面上显示关于学生的一些信息,我只需要studentName,笔记数量和所有笔记。 我创建了一个StudentDTO,它看起来是这样的:
public class StudentDTO {
private Long count;
private String name;
private List<Note> notes;
/* Getters and setters */
}
,我使用下面的代码映射学生和注释从DB
private static void testDTO() {
Session session = getSessionFactory().openSession();
String queryString = "SELECT count(n) as count, s.studentName as name, s.studentNotes as notes " +
"from Student s join s.studentNotes n where s.id = 3";
Query query = session.createQuery(queryString);
List<StudentDTO> list = query.setResultTransformer(Transformers.aliasToBean(StudentDTO.class)).list();
for (StudentDTO u : list) {
System.out.println(u.getName());
System.out.println(u.getCount());
System.out.println(u.getNotes().size());
}
}
以上恢复到StudentDTO代码在查询中提取了笔记时失败,但是如果我删除笔记并只获取名称并且计数工作正常。
时的注意事项包括在查询中,这是由休眠射出的错误:
select
count(studentnot2_.NOTE_ID) as col_0_0_,
. as col_3_0_,
studentnot3_.NOTE_ID as NOTE_ID1_2_,
studentnot3_.NOTE_CONTENT as NOTE_CON2_2_,
studentnot3_.STUDENT_ID as STUDENT_3_2_
from
students studentx0_
inner join
notes studentnot2_
on studentx0_.STUDENT_ID=studentnot2_.STUDENT_ID
inner join
notes studentnot3_
on studentx0_.STUDENT_ID=studentnot3_.STUDENT_ID
where
studentx0_.STUDENT_ID=3;
这是错误消息,我得到:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as col_3_0_, studentnot3_.NOTE_ID as NOTE_ID1_2_, studentnot3_.NOTE_CONTENT as N' at line 1
现在我可以看到查询是错误的,但是它是由Hibernate生成的,而不是我控制的东西。有什么我需要改变我的查询字符串,以实现我需要的结果。
我不想要的结果手动映射到我的DTO,是没有办法,我可以在我的Student.java studentNotes直接映射到音符StudentDTO.java
但是这打败了DTO的目的。我将不得不手动填充StudentDTO的字段 –