我在使用jBoss AS的项目中使用Oracle作为数据库和Spring Data。
使用GROUP BY的简单查询不起作用 这是存储库代码:
public interface UseCaseRepository extends JpaRepository<UseCase, Long> {
@Query("SELECT uc.channel FROM UseCase uc WHERE uc.activity = ?1 GROUP BY uc.channel")
public List<Channel> getUseCaseChannelByActivity(Activity activity);
[...]
错误如下所示
2016-06-29 17:22:12,780 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--0.0.0.0-443-3) SQL Error: 979, SQLState: 42000
2016-06-29 17:22:12,780 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--0.0.0.0-443-3) ORA-00979: not a GROUP BY expression
与MySQL数据库相同的查询没有问题。
这些是实体
@Entity
@Table(name="USE_CASE")
@NamedQuery(name="UseCase.findAll", query="SELECT u FROM UseCase u")
public class UseCase implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="USE_CASE_ID")
private long useCaseId;
//uni-directional many-to-one association to Activity
@ManyToOne
@JoinColumn(name="ACTIVITY_ID")
private Activity activity;
//uni-directional many-to-one association to Channel
@ManyToOne
@JoinColumn(name="CHANNEL_ID")
private Channel channel;
//uni-directional many-to-one association to PushTool
@ManyToOne
@JoinColumn(name="PUSH_TOOL_ID")
private PushTool pushTool;
//uni-directional many-to-one association to Tool
@ManyToOne
@JoinColumn(name="TOOL_ID")
private Tool tool;
//uni-directional many-to-many association to DataSource
@ManyToMany
@JoinTable(
name="USE_CASE_DATA_SOURCE"
, joinColumns={
@JoinColumn(name="USE_CASE_ID")
}
, inverseJoinColumns={
@JoinColumn(name="DATA_SOURCE_ID")
}
)
private List<DataSource> dataSources;
[...]
@Entity
@NamedQuery(name="Activity.findAll", query="SELECT a FROM Activity a")
public class Activity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="ACTIVITY_ID")
private long activityId;
private String attribute;
@Column(name="\"TYPE\"")
private String type;
[...]
@Entity
@NamedQuery(name="Channel.findAll", query="SELECT c FROM Channel c")
public class Channel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="CHANNEL_ID")
private long channelId;
private String attribute;
@Column(name="\"TYPE\"")
private String type;
[...]
任何想法如何解决? 感谢
答案 0 :(得分:0)
在查询中使用GROUP BY子句时,必须在SELECT列表中包含所有聚合表达式。
我认为这里Hibernate生成的查询是
SELECT uc.id, uc.user_case_id,[...] FROM use_case uc WHERE [...] GROUP BY uc.channel_id
(尝试检查Hibernate生成的SQL查询,它总是有用的!)