我的条件查询,在执行时,会导致以下异常抛出:任何人都可以告诉为什么这个Hibernate查询无效吗?
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注解的实体属性。基本上,我试图为ID为2的角色对象加载当时未初始化的属性“权限”.ID属性是长类型的。
关于为什么这个查询会失败的任何想法?
我可以在这里发布创建条件查询的代码,但它相当复杂(因为它基于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的角色的权限对象集合。这是一个尝试只选择“perm issions“collection from the object role with id = 2.
我是新来的标准查询,我很难找到它有什么问题。
什么数据类型是权限? – 2010-10-27 01:58:53