2017-09-26 36 views
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

回答

0

貌似这个查询是错误的方式。更好的办法是只让学生。您始终可以从学生处收集笔记。

Session session = getSessionFactory().openSession(); 
String queryString = from Student s where s.studentId = 3; 
Query query = session.createQuery(queryString); 
Student student = query.getSingleResult(); 
sysout(student.getNotes().size()) 

此外,我从来没有在SELECT子句中以这种方式检索集合;所以,不知道,但你真的需要

join s.studentNotes 

在您的查询?不知道我的回答是否有帮助。

+0

但是这打败了DTO的目的。我将不得不手动填充StudentDTO的字段 –