语法错误Hibernate - 意外令牌:ON

时间:2014-02-04 15:22:41

标签: java mysql hibernate spring-mvc

我有三张桌子: 相机 - [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

我必须改变我课程中的某些内容

2 个答案:

答案 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 []列表然后自己选择每个值来自己转换它们。