2011-04-07 86 views
1

好的,我已经使用双向@ManyToMany关系与注释映射了两个表。休眠:只查找那些不是多对多关系的行

现在我只想返回不是多对多关系的元素,我试图使用here中的代码,但它在运行时引发异常。 这里的HQL:

String hql = "select a from Article a " + 
       "left join a.tags t " + 
       "group by a " + 
       "having count(t)=0"; 

有没有更好的方式来返回这些元素?或者修复这个查询中的错误?

现在抛出的例外是:

column "article0_.id" must appear in the GROUP BY clause or be used in an aggregate function 

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL ... 
+0

你能提供SQL访问DB时休眠产生?它似乎试图让所有的字段进行映射,但只有其中一个被包含在'group by'条件中。 – Donz 2011-04-07 07:34:57

+0

@Donz,我会尝试提取它,同时尝试这些建议。 – 2011-04-07 12:45:05

回答

2

查询是正确的,但在某些数据库group by a是不够的,你必须enoberate a的所有属性,如group by a.id, a.title

或者,你可以使用下面的查询:

select a from Article a where a.tags is empty 

参见:

+0

它的工作原理!但现在我在我的小组中拥有> 10个物业。另外,如果我改变模型中的某些东西,我必须在查询中明确地进行更改。我可以做一些像。*一样的东西吗?要选择所有属性? – 2011-04-07 13:20:25

+0

@moondowner:使用'join' - 否,但是您的任务可以在没有'join'的情况下解决,请参阅更新。 – axtavt 2011-04-07 14:17:57

1

不知道它是否会工作,但你可以试一试:

String hql = "select a from Article a " + 
       "where a.tags=null "; 
+0

我现在就试一试。 – 2011-04-07 12:45:43

+0

它不起作用,它返回:'错误:语法错误在或接近“。”' – 2011-04-07 12:50:13

+0

嗯!一种调试方式可以是:获取由Hibernate生成的SQL,尝试通过独立的数据库客户端将该查询直接执行到数据库。看看你到那里有什么错误。尝试修复SQL查询。当你修好后,你将有更好的机会解决你的HQL问题。 – craftsman 2011-04-07 13:20:50