2013-11-19 3 views
1

Я получаю эту ошибку, и я не могу найти ссылку на него:Hibernate ожидает «все», нашел «(» - что это значит

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) 

Ниже Query я? ., используя

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

Из Hibernate справочной главы 14.3. Associations and joins:.

Соединение «выборки» позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами с использованием одного выбора ... Подробнее см. Раздел 19.1 «Стратегии получения».

Вы также увидите, что там должно быть использовано после join ключевого слова как в from e1 left join fetch e2. Он также может использоваться как в from entity fetch all properties (вот почему Hibernate ожидает ключевое слово all).

Что касается вашего конкретного запроса, и, насколько я знаю, с помощью HQL вы не можете указать условия соединения. Спящий режим будет автоматически выполнять соединение, используя условия, заданные при сопоставлении. Вот почему для сопоставления HQL необходимо сопоставить отношения.

И самое главное, помните, что соединения в HQL совершенно разные. Вы не присоединяетесь к двум сущностям, вы присоединяетесь к объекту с одним из его значений свойств (ассоциаций). Обратите внимание, что вы всегда можете сделать cartesian-like присоединяется (обратите внимание на производительность и всегда смотрите на сгенерированные запросы и планы выполнения).

В качестве побочного примечания можно считать неправильной практикой добавлять значения параметров непосредственно в запрос (из-за потенциальных уязвимостей для инъекций). Вместо этого вы должны использовать именованные параметры.