我收到此错误,但找不到任何引用:
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的类,其中包含构造函数中的属性,我想基于它获取一个列表。
答案 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中的连接是完全不同的。您没有加入两个实体,您使用其集合值属性(关联)之一加入实体。请注意,您始终可以执行类似于笛卡儿的连接(注意性能并始终查看生成的查询和执行计划)。
作为旁注,将参数值直接附加到查询中可能被视为不良做法(由于潜在的注入漏洞)。您应该使用命名参数。