Java Hibernate期待“全部”,找到“(”-这是什么意思?
我收到此错误,但找不到任何引用:Java Hibernate期待“全部”,找到“(”-这是什么意思?,java,hibernate,join,hql,fetch,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 permissi
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参考章节: fetch联接允许使用单个select初始化值的关联或集合及其父对象…有关更多信息,请参阅第19.1节“获取策略” 您还将看到,它必须在joinkeyword之后使用,如from e1 left join fetch e2。它也可以在from entity fetch all properties中使用。这就是Hibernate需要all关键字的原因 关于您的特定查询,据我所知,使用HQL您无法指定联接条件。Hibernate将使用映射中配置的条件自动执行联接。这就是为什么需要映射关系才能使用HQL联接的原因 最重要的是,请记住HQL中的联接是完全不同的。您不会联接两个实体,而是使用一个集合值属性关联来联接一个实体。请注意,您可以始终执行类似笛卡尔的联接。请注意,注意性能,并始终查看生成的查询和执行计划 作为旁注,由于潜在的注入漏洞,将参数值直接附加到查询中可能被认为是不好的做法。您应该改用命名参数