我熟悉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>
希望它能解决您的错误。