2016-11-12 61 views
1

我收到以下错误,同时使用命名查询blog.findBlogsJPA集团通过与多个现场

“你的选择和having子句必须只包括集合或值也出现在分组子句。”

在select子句中,我使用了b.id,所以它必须允许无误地执行这个查询。我也尝试从MySQL工作台相同的查询和它的工作完全正常。

@NamedQueries(value = { 
     @NamedQuery (name = "blog.findBlogs", query = "SELECT " + 
          "NEW com.vo.Blog(b.id, b.blogId, b.createDate, b.tags, b.url, COUNT(r.emotion)) " + 
          "FROM Blog b JOIN b.rates r " + 
          "GROUP BY b.id") 
}) 

方面,艾米特J.

回答

0

一般而言,GROUP BY查询SQL中必须遵守的规则出现的SELECT子句中的一切必须要么出现在GROUP BY子句中或者是一个聚集函数里面,如COUNT

I also tried same query from mysql workbench and its working perfectly fine.

事实证明,MySQL是少数几个不执行这条规则的数据库之一。但是JPA似乎不允许这样做,所以即使底层数据库是MySQL的松散版本,它也会从JPA运行失败。

这里是你如何修改代码以运行没有错误:

@NamedQueries(value = { 
    @NamedQuery (name = "blog.findBlogs", query = "SELECT " + 
         "NEW com.vo.Blog(b.id, COUNT(r.emotion)) " + 
         "FROM Blog b JOIN b.rates r " + 
         "GROUP BY b.id") 
}) 

如果你想知道什么与你的原始查询的逻辑问题是,它是,对于给定b.id值,JPA无法计算出哪个博客,日期和标签值为该组选择。

+0

感谢您的回复。 在select子句中,我对其他字段感兴趣,并且对Id很感兴趣。 –

+0

你的问题没有意义。你想要哪些其他值?您需要提供确定为每个ID组保留哪个值的逻辑。 –

+0

它看起来像group by应改为 b.id,b.blogId,b.createDate,b.tags,b.url 而不是只有 b.id 基本上我想填充博客VO以及它的评级来自费率实体。博客可以由多个用户评分 –