我熟悉Java,但是对于ORM和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();


编辑2:

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

最佳答案

尝试这个

(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.cfg.xml -->
<property name="show_sql">true</property>


希望它能解决您的错误。

07-24 12:30