【问题标题】:Join in @NamedQuery: Unexpected token ON加入@NamedQuery:意外的令牌开启
【发布时间】:2015-04-03 20:21:36
【问题描述】:

在 Hibernate 中,我使用 JOIN 创建了一个查询来连接两个表。该查询在 Oracles SQL Developer 中执行良好。但是,如果我将其添加到 @NamedQuery,服务器会以以下错误启动:

命名查询中的错误:loadFooByAnother:org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:在第 1 行,第 xxx 列附近打开

我的命名查询是:

SELECT foo FROM FooTable foo JOIN BarTable bar
  ON foo.something=bar.somethingId
    WHERE bar.anotherId=:another

在Hibernate中不能使用JOIN .. ON语法吗?

【问题讨论】:

    标签: java sql hibernate join named-query


    【解决方案1】:

    如果您使用 HQL,则需要使用 with 指令:

    SELECT foo 
    FROM FooEntity foo 
    JOIN foo.bar b with b.name = :name
    WHERE foo.prop = :prop
    

    这是为了提供一个自定义的ON 子句。从您的示例来看,从您连接表的方式来看,我认为您尝试使用 @NamedQuery 执行本机 SQL。

    如果要运行原生 SQL 查询,则必须改用 @NamedNativeQuery。

    如果要使用 HQL,则需要使用 Entities 并加入 Entity 关联(不是表)。

    如果您使用 JPQL,则必须将 with 指令替换为 on 指令,但同样,您需要导航实体关联,这意味着您必须先映射它们。

    【讨论】:

    • 感谢您指出有@NamedQuery 和@NamedNativeQuery。然后我混合了原生 SQL 和 HQL。不过,WITH 关键字的唯一引用是在 this article 中。
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2016-06-18
    • 2019-07-04
    • 1970-01-01
    • 2019-03-21
    • 2020-03-16
    相关资源
    最近更新 更多