Hibernate SQL查询结果映射/转换为对象/类/ Bean

YET*_*ETI 12 java sql hibernate hibernate-mapping

1 2:select(table.*)/(all column)没问题

String sql = "select t_student.* from t_student";
//String sql = "select t_student.id,t_student.name,... from t_student"; //select all column
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Student.class);//or query.addEntity("alias", Student.class);
//query.list();[Student@..., Student@..., Student@...]
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //or other transformer
query.list(); //[{Student(or alias)=Student@...},{Student=Student@...}]
Run Code Online (Sandbox Code Playgroud)

3:选择一些列(不是全部),是错误

String sql = "select t_student.id,t_student.name.t_student.sex from t_student";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Student.class);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
query.list(); //Exception:invalid column/no column
Run Code Online (Sandbox Code Playgroud)

我希望"3"正常工作,并将结果映射到Student.class.
喜欢:学生[id =?,name =?,sex =?,(其他字段为null /默认)]
我不知道这个错误,请帮帮我!

Paw*_*iak 23

您可以进一步添加 .setResultTransformer(Transformers.aliasToBean(YOUR_DTO.class)); 并自动将其映射到自定义dto对象,另请参阅返回非托管实体.

例如:

public List<MessageExtDto> getMessagesForProfile2(Long userProfileId) {
    Query query = getSession().createSQLQuery("  "
            + " select a.*, b.* "
            + " from messageVO AS a "
            + " INNER JOIN ( SELECT max(id) AS id, count(*) AS count FROM messageVO GROUP BY messageConversation_id) as b ON a.id = b.id "
            + " where a.id > 0 "
            + " ")
            .addScalar("id", new LongType())
            .addScalar("message", new StringType())
            ......... your mappings
            .setResultTransformer(Transformers.aliasToBean(MessageExtDto.class));

    List<MessageExtDto> list = query.list();
    return list;
}
Run Code Online (Sandbox Code Playgroud)

  • 它应该是有用的,但我很懒,我以为它可以自动转换. (5认同)

Mik*_*kin 3

只有两种方法。

您可以使用第一个或第二个片段。根据 Hibernate 文档,您必须更喜欢第二个。

您可以只获取对象数组的列表,如下所示:

String sql = "select name, sex from t_student";
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("name", StringType.INSTANCE); 
query.addScalar("sex", StringType.INSTANCE); 
query.list();
Run Code Online (Sandbox Code Playgroud)