hibernate - 迭代查询

时间:2012-06-12 11:46:14

标签: hibernate

我有两个外键关联的测试表

  • School(fk on student_id
  • 表格Students(pk on id
  • FK:school.student_id -> students.id

如何使用此查询获取学生姓名?

Session session = DaoSF.getSessionFactory().openSession();
String query = "";
Query criteria;

query = "from School s " +
        "inner join s.student st " +
        "where s.student_id = st.id";
criteria = session.createQuery(query);

当我尝试迭代数据时:

for(Iterator<?> iter = criteria.iterate(); iter.hasNext();)
{
  Object item = (Object)iter.next();
  System.out.println(((School) item).getStudent().getId());
}

报道:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to table.School

但是映射工作正常,因为当我将最后一行更改为

System.out.println(item.toString());

我已经获得了所有数据,但是那样:

[Ljava.lang.Object;@1d2300e
[Ljava.lang.Object;@51207c
[Ljava.lang.Object;@2bd615
...

2 个答案:

答案 0 :(得分:3)

在HQL中,无论何时加入没有显式select子句,Hibernate都会返回所有已连接的实体。它不是最直观的东西,但它是此时的遗留行为。

其次,您正在重申学校与学生之间的联系条件。你已经在映射中指定了它,所以Hibernate知道当你说&#34;加入s.student&#34;在查询中。所以这里不需要where子句。

你的数据模型似乎有点倒退我认为从大多数人对学校/学生关系的看法。一般来说,学校有多个学生(学生是与学校有特定关系的人)。但鉴于你描述的模型......

您尚未准确说明您希望查询的内容,但原始查询会返回所有学生。不知道为什么你甚至&#34;开车&#34;来自School对象的查询。

Session session = ...;
List<Student> results = (List<Students>) session.createQuery( "select s from Students s" ).list();
for ( Student student : results ) {
    // handle each student
}

如果你只想要学生的名字(你可以分类/善意的话):

Session session = ...;
List<String> results = (List<String>) session.createQuery( "select s.name from Students s" ).list();
for ( String student : results ) {
    // handle each student name
}

请注意,在我的上述查询中,select子句实际上是可选的,因为from子句中只引用了一个实体。我更喜欢始终指定一个显式的select子句。

答案 1 :(得分:0)

您的迭代器是Object类型。尝试用School键入它。

for(Iterator<School> iter=criteria.iterate();iter.hasNext();){...}

由于这似乎不起作用,请尝试以下方法。

String sql="...";
Query query=session.createQuery(sql);
List<School> schools=(List<School>)query.list();
    for(School school:schools)
        System.out.println(school.getStudent().getId());