java - Hibernate 期待 "all",发现 '(' - 这是什么意思?

标签 java hibernate join hql fetch

我遇到了这个错误,但我找不到任何对它的引用:

    org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "all", found '(' near line 1, column 221 [select new EffectivePermissions(r.id, r.name, r.defaultValue, rc.value AS companyValue, ru.value AS userValue) from permissionsPackage.Entity.Permissions r left join permissionsPackage.Entity.CompanyPermissions rc fetch (r.id=rc.permissionId AND rc.companyId=2313 ) left join permissionsPackage.Entity.UserPermissions ru fetch (r.id=ru.permissionId AND ru.userId=1)]
 at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
 at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
 at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79)

下面是我正在使用的查询。

  this.hql = "select new EffectivePermissions(r.id, r.name, r.defaultValue, rc.value AS companyValue, ru.value AS userValue) "
            + "from "
            + Permissions.class.getName()
            + " r "
            + "left join "
            + CompanyPermissions.class.getName()
            + " rc "
            + "fetch (r.id=rc.permissionId AND rc.companyId="
            + user.getCompany().getId()
            + " ) "
            + "left join "
            + UserPermissions.class.getName()
            + " ru "
            + "fetch (r.id=ru.permissionId AND ru.userId="
            + user.getId()
            + ")";

    Query query = sessionFactory.getCurrentSession().createQuery(hql);

    permissions = query.list();

我有一个名为 EffectivePermission 的类,其构造函数中包含属性,我想获得一个基于它的列表。

最佳答案

来自 Hibernate 引用章节 14.3. Associations and joins :

A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select ... See Section 19.1, “Fetching strategies” for more information.

您还会看到它必须在 join 关键字之后使用,如 from e1 left join fetch e2 中所示。它也可以用作 from entity fetch all properties(这就是为什么 Hibernate 需要 all 关键字)。

关于您的具体查询,据我所知,使用 HQL 您无法指定连接条件。 Hibernate 将使用映射中配置的条件自动执行连接。这就是为什么必须映射关系才能使用 HQL 连接。

最重要的是,请记住 HQL 中的联接是完全不同的。您不是加入两个实体,而是加入一个具有其集合值属性(关联)之一的实体。请注意,您始终可以执行类笛卡尔 联接(注意性能并始终查看生成的查询和执行计划)。

作为旁注,将参数值直接附加到查询中可能被认为是不好的做法(由于潜在的注入(inject)漏洞)。您应该改用命名参数。

关于java - Hibernate 期待 "all",发现 '(' - 这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20069184/

相关文章:

ubuntu - 根据第一列 ID 连接两个文件

java - gwt动态添加文本框

java - java.util.* 包是否仅适用于实用程序类?

mysql - JPA @Table 注释 "catalog"和 "schema"变量用于什么?

java - 如何构建可嵌入类型的 ElementCollection?

sql - 拆分独立表的查询或多个连接

mysql - 每个连接的计数 - 优化

java - 按 "run app"时出现 Gradle 错误 - Android Studio 0.4.3 [无法创建 Tooling API 实例]

java - 将项目升级到grails 2.0.1

java - 无法获取更新查询以与 Hibernate 一起使用