【问题标题】:Jpa namedquery with left join fetch带有左连接提取的 Jpa 命名查询
【发布时间】:2014-09-11 18:41:44
【问题描述】:

这是我的命名查询:

@NamedQuery( name = "User.findOneWithLists", 查询 =“从用户 u 中选择你” + "LEFT JOIN FETCH u.aTemplates" + "LEFT JOIN FETCH u.bTemplates" + "LEFT JOIN FETCH u.bp" + "LEFT JOIN FETCH u.aCredentials" + "LEFT JOIN FETCH u.st WHERE (st.deleted = false)" + "LEFT JOIN FETCH u.bCredentials" + "LEFT JOIN FETCH u.cl" + "WHERE u.id= :id")

我的问题是应用程序启动时出现错误:

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:LEFT ....

在st侧有注解

@ManyToOne
 @JoinColumn(name = "st_user")
 private User user;

知道如何处理这个 where 子句吗?

【问题讨论】:

    标签: java hibernate jpa annotations named-query


    【解决方案1】:

    检查一个SQL语法,你不能在where子句之后使用left join。如果您正在查看名为查询的 SQL 生成的表单,您将看到查询中的连接表 where 子句出现在连接之后,并且应该指定通过键链接这些表的相等条件。左边是主表的主键,右边是连接表的外键。连接表由多对一关联的属性指定。

    @NamedQuery(
        name = "findOneWithLists",
        query = "from Table t left join User u where u.id= :id"
    )
    

    【讨论】:

    • 好的,但是我怎样才能用 where 或类似的东西进行左连接
    • 这不是 SQL。是JPQL。 JPQL 不使用表格。它使用实体。答案的第一句话是正确的,但其余的不是。
    • @JBNizet 没错,JPQL 或 HQL 不需要条件,但生成的 SQL 使用它们。
    • @user3296520 如果您使用的是 JPA 2.1,则可以使用 ON 子句,就像在 SQL 中一样:left join u.st st on st.deleted = false。但是您不能在左连接 fetch 上使用 ON 子句。用户的“sts”总是包含所有用户的sts。您不能加载用户并假装它只有未删除的 sts。
    【解决方案2】:

    对于连接条件,Hibernate 提供了 with 关键字,甚至在 JPA 2.1 之前。

    因此,您查询的相关部分如下所示:

    SELECT u FROM User u  ... LEFT JOIN u.st WITH st.deleted = false
    

    我不确定LEFT JOIN FETCH u.cl with u.id= :id,但如果我没记错的话,这并不容易,可能必须通过修改后的连接和在 where 条件下的u.ui = :id 来解决。

    LEFT JOIN FETCH u.st WITH st.deleted = false`

    这不受支持,因为您无法进行部分提取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2019-03-27
      • 1970-01-01
      • 2011-06-12
      • 2015-07-11
      相关资源
      最近更新 更多