Jpa namedquery with left join fetch

时间:2014-07-21 09:45:10

标签: java hibernate jpa annotations named-query

这是我的名字查询:

  

@NamedQuery(                   name =" User.findOneWithLists",                   query =" SELECT u FROM User 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子句?

2 个答案:

答案 0 :(得分:7)

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

where

答案 1 :(得分:0)

对于连接条件,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`

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