【问题标题】:Hibernate expecting "all", found '(' - what does this mean?Hibernate 期待“全部”,发现 '(' - 这是什么意思?
【发布时间】:2013-12-02 20:47:26
【问题描述】:

我收到此错误,但找不到任何参考:

    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 的类,它具有构造函数中的属性,我想获得一个基于它的列表。

【问题讨论】:

    标签: java hibernate join hql fetch


    【解决方案1】:

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

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

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

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

    最重要的是,请记住 HQL 中的联接是完全不同的。您不加入两个实体,而是将一个实体与它的集合值属性之一(关联)结合起来。请注意,您始终可以进行 cartesian-like 联接(注意性能并始终查看生成的查询和执行计划)。

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

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2011-09-04
      相关资源
      最近更新 更多