我有三张桌子: 相机 - [id,address,city,url,server_name,...] vlc - [id,camera_id(相当于摄像机中的id),server_name,port,status] 类别 - [id,name]
听到我的MySQl语法,这给了我很好的结果:
"SELECT vlc.camera_id, vlc.url, vlc.port,"
+ " vlc.server_name, cameras.address, cameras.city, categories.name FROM vlc AS vlc" +
" INNER JOIN cameras ON vlc.camera_id = cameras.id" +
" INNER JOIN categories ON cameras.category_id = categories.id"
+ " WHERE vlc.status = 'active' AND ")
但是在Hibernate中我得到了这个语法错误:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ON near line 1, column 141
任何人都可以提供帮助?我知道这可能是显而易见的,但我无法找到解决方案。
编辑: 我改为:
@SuppressWarnings("unchecked")
public List<VLC> getVLCs() {
return getCurrentSession().createSQLQuery("SELECT vlc.camera_id, vlc.url, vlc.port,"
+ " vlc.server_name, cameras.address, cameras.city, categories.name FROM vlc AS vlc" +
" INNER JOIN cameras ON vlc.camera_id = cameras.id" +
" INNER JOIN categories ON cameras.category_id = categories.id"
+ " WHERE vlc.status = 'active'").list();
}
但现在我得到了:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to pl.humandevice.model.VLC
我必须改变我课程中的某些内容
答案 0 :(得分:0)
使用createSQLQuery
代替createQuery
。
第二个是HQL(Hibernate查询语言)而不是SQL。
<强> UPD:强> 使用SQL hibernate无法将已回收的数据包装到对象中。这就是你必须使用HQL。
的原因E.G:
public List<VLC> getVLCs() {
return getCurrentSession().createQuery("from Cat as cat inner join fetch cat.mate left join fetch cat.kittens").list();
}
Cat 类映射到表格。
答案 1 :(得分:0)
您已将其更改为本机SQL,但您正在使用来自VLC和相机对象的属性进行投影,您需要将select限制为VLC对象,以便Hibernate知道如何将请求的属性列表映射到VLC对象,或者显式通过接收一个OBject []列表然后自己选择每个值来自己转换它们。