Hibernate期待“全部”,发现'(' - 这是什么意思?

时间:2013-11-19 10:37:26

标签: 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的类,其中包含构造函数中的属性,我想基于它获取一个列表。

1 个答案:

答案 0 :(得分:1)

来自Hibernate参考章节14.3. Associations and joins

  

“fetch”连接允许使用单个选择初始化值的关联或集合及其父对象...有关详细信息,请参见第19.1节“获取策略”。

您还会看到它必须在join之后的from e1 left join fetch e2关键字后使用。from entity fetch all properties。它也可以在all中使用(这就是Hibernate期望{{1}}关键字的原因)。

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

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

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