使用addEntity

时间:2017-08-04 02:05:59

标签: java mysql hibernate

我熟悉Java,但对ORM和Hibernate来说真的很新。

我使用以下查询来获取hibernate中表的所有列的结果集。

(List<Neighborhood>)session.createSQLQuery("SELECT * FROM Neighborhood").addEntity(Neighborhood.class).list();

我想从这个表中只获得两个特定的列。我查看了互联网,但无法找到可用作上述声明修改的解决方案。

我尝试了以下查询,但获得了 - SQLGrammarException: could not extract ResultSet

(List<Neighborhood>)session.createSQLQuery("SELECT neighborhoodName,educationYouth FROM Neighborhood").addEntity(Neighborhood.class).list();

编辑:

在@ scaryWombat的建议之后又有两次尝试查询。两者都给出相同的异常

第一

List list = session.createSQLQuery("SELECT neighborhoodName,educationYouth FROM Neighborhood").list();

第二

String sql = "SELECT neighborhoodName,educationYouth FROM Neighborhood";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();

Edit2:

在@ Tehmina的解决方案之后,我收到一个错误 - java.sql.SQLException: Column 'educationYouth' not found因为educationYouth是类名“EducationYouth”的对象。 在邻居表中没有名称为educationYouth的列,而是来自EducationYouth类的所有列。

1 个答案:

答案 0 :(得分:1)

试试这个

(List<Neighborhood>)session.createSQLQuery("SELECT * FROM Neighborhood").list();

为了避免使用ResultSetMetadata的开销,或者只是在返回的内容中更明确,可以使用addScalar():

(List<Neighborhood>)session.createSQLQuery("SELECT * FROM Neighborhood").addScalar("neighborhoodName", Hibernate.STRING).addScalar("educationYouth", Hibernate.STRING);

或试试这个 Hibernate自动将数据转换为适当的类型。自动转换在所有情况下都不起作用,在这种情况下,我们有一个addScalar()的重载版本:

SQLQuery q = session.createSQLQuery("SELECT * FROM Neighborhood");        
    q.addScalar("neighborhoodName");    
    q.addScalar("educationYouth");   
     List<Object[]> rows = q.list();
for (Object[] row : rows) {
    System.out.println(row[0] + " " + row[1] );

不要忘记检查hibernate配置文件

<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>

我希望它能解决你的错误。