2011-04-06 48 views
1

软件< -m:N->标签JPQL查询多对多

我想选择其中tag.id = ID

我写的所有软件创建查询:

TypedQuery query = 
       Software.em().createQuery(
       "SELECT DISTINCT s FROM Software s INNER JOIN s.tags WHERE s.tags.id = :tagId", 
       Software.class 
      ); 
       query.setParameter("tagId", tagId); 

的结果我有:

了java.lang.IllegalArgumentException 被抓到, org.hibernate.QueryException:非法 试图取消引用集合 [software0_.id.tags]与元件 属性引用[ID] [SELECT DISTINCT 期从models.Software小号 INNER JOIN s.tags WHERE s.tags。 id = :tagId]

我该如何实现它?为什么我有这样的例外?

回答

2

我认为这个问题可能是你在你的语句中遗漏了FROM子句。 错误“Unexpected token:INNER”被给出,因为它期望一个FROM。

尝试以下查询:

SELECT DISTINCT s FROM Software s INNER JOIN s.tags t WHERE t.id = :tagId 
+0

我修正了。也许,但是当我把我从我得到:java.lang.IllegalArgumentException已被捕获,org.hibernate.QueryException:非法尝试取消引用具有元素属性引用[id]的集合[software0_.id.tags] [SELECT DISTINCT s FROM模型。软件s INNER JOIN s.tags WHERE s.tags.id =:tagId] – ses 2011-04-06 09:32:42

+0

试试这个:'SELECT DISTINCT s FROM Software s INNER JOIN s.tags t WHERE t.id =:tagId'。 – Elvander 2011-04-06 09:44:28

1

我会尝试:

Query q = JPA.em().createQuery("SELECT DISTINCT s FROM Software s join fetch s.tags t WHERE t.id = :tagId"); 
q.setParameter("tagId", tagId); 

这应该工作。