我有两个外键关联的测试表
School
(fk on student_id
)Students
(pk on id
)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
...
答案 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());