2010-10-27 100 views
0

我的条件查询,在执行时,会导致以下异常抛出:任何人都可以告诉为什么这个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.

我是新来的标准查询,我很难找到它有什么问题。

+0

什么数据类型是权限? – 2010-10-27 01:58:53

回答

2

没有更多的信息,这听起来像你正在尝试做的是这样的:

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

您可以发布您注明实体和你的标准的样本?

相关问题