Может кто-нибудь сказать, почему этот запрос Hibernate является недействительным? - PullRequest
0 голосов
/ 27 октября 2010

У меня есть запрос критерия, который при выполнении выдает следующее исключение:

java.lang.IllegalArgumentException: org.hibernate.QueryException: illegal syntax near collection: id [select generatedAlias0.permissions from temp.package.commons.user.Role as generatedAlias0 where generatedAlias0.id=2L]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1222)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:320)
at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:227)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:437)
at temp.package.dao.impl.DefaultDAOService.getProperties(DefaultDAOService.java:585)

Как видно из поля кода, запрос, который вызывает ошибку:

select generatedAlias0.permissions from temp.package.commons.user.Role as generatedAlias0 where generatedAlias0.id=2L

Атрибут id - это атрибут сущности, аннотированный @Id @GeneratedValue.В основном я пытаюсь загрузить атрибут "permissions", который является неинициализированной в то время коллекцией, для объекта роли, чей идентификатор равен 2. Атрибут id имеет тип long.

Любые идеипочему этот запрос не будет выполнен?

Я могу опубликовать здесь код, который создает запрос по критериям, но он довольно сложный (поскольку он генерируется на основе фильтра LDAP и т. д.), поэтому янадеясь, что ошибка будет видна из сгенерированной строки запроса и исключения.Пожалуйста, дайте мне знать, если это не так.

Последующие действия: Запрос критериев, сгенерировавший эту ошибку, был построен следующим образом:

EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();

// queryScopeClass is assigned to type temp.pack.commons.user.Role
Class<? extends T> queryScopeClass = role.getClass();

Root<? extends T> from = criteriaQuery.from(queryScopeClass);

Predicate predicate = criteriaBuilder.equal(from.get("id"), new Long(2));
criteriaQuery.where(predicate);

// attempting to get just the role's permissions
CriteriaQuery<Object> select = criteriaQuery.select(from.get("permissions"));
TypedQuery<Object> typedQuery = entityManager.createQuery(select);

return typedQuery.getResultList();

Роль иКлассы разрешений были отображены с помощью JPA и некоторых аннотаций Hibernate, например:

public abstract class Role implements Serializable {

 /**
  * The id of this role. Internal use only.
  * 
  * @since 1.0
  */
 @Id @GeneratedValue
 protected long id;

 /**
  * Set of permissions granted to this role.
  * 
  * @since 1.0
  */
 @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy="sourceRole")
 protected Set<Permission> permissions = new HashSet<Permission>();

...

}

public class Permission implements Serializable {
 private static final long serialVersionUID = 1L;

 /**
  * The id of this permission. Used internally for persistence.
  * 
  * @since 1.0
  */
 @Id @GeneratedValue
 @Column(name = "PERMISSION_ID")
 protected long id;

 /**
  * The group to which the owner of this permission is being granted permission to.
  * 
  * @since 1.0
  */
 @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
 @JoinColumn(name = "TARGET_ROLE_ID")
 @ForeignKey(name = "FK_TARGET_GROUP_PERMISSION_ID",
   inverseName = "FK_PERMISSION_ID_TARGET_GROUP")
 protected Group targetGroup;

 /**
  * The role that has been granted this permission.
  * 
  * @since 1.0
  */
 @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
 @JoinColumn(name = "SOURCE_ROLE_ID")
 @ForeignKey(name = "FK_SOURCE_GROUP", inverseName = "FK_GROUP_PERMISSIONS")
 private Role sourceRole;

...

}

Я ожидал, что вызов typedQuery.getResultList () вернет список коллекций с одним элементом: коллекцией объектов разрешенийдля роли с id = 2. Это попытка выбрать только коллекцию «полномочий» из роли объекта с id = 2.

Я новичок в критериях запросов, и мне труднонайти, что с ним не так.

1 Ответ

2 голосов
/ 27 октября 2010

Без дополнительной информации кажется, что вы пытаетесь сделать что-то вроде:

select rp
from Role r
inner join r.permissions rp
where r.id = 2

Можете ли вы опубликовать свои аннотированные объекты и образец ваших критериев?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...