在Oracle数据库的Spring Data中使用GROUP BY进行JPA查询

时间:2016-06-29 16:06:57

标签: oracle jpa spring-data spring-data-jpa

我在使用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;
[...]

任何想法如何解决? 感谢

1 个答案:

答案 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查询,它总是有用的!)