2016-06-29 4 views
2

Ich verwende Oracle als Datenbank und Spring Data für ein Projekt mit jBoss AS.JPA-Abfrage mit GROUP BY im Frühjahr Daten zur Oracle-Datenbank

Eine einfache Abfrage mit einer GROUP BY funktioniert nicht.
Dies ist der Repository-Code:

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); 

[...] 

Der Fehler unter

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 

Die gleiche Abfrage mit einer MySQL-Datenbank angezeigt wird kein Problem hat.

Dies sind die Einheiten

@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; 
[...] 

Jede Idee, wie zu lösen? Danke

+0

Dies ist eine schlechte oder irrelevante Frage sein kann, aber was ist 'WHERE uc.activity =? 1 'gemeint? Ich hätte erwartet, "WHERE ucactivity =?" Zu sehen, mit nur einem einzigen Fragezeichen, das den Parameter bezeichnet. –

+0

ich denke, es wurde hier beantwortet http://stackoverflow.com/questions/20074562/group-by-without-aggregate-function –

+1

Sie brauchen wahrscheinlich nicht einmal eine Gruppe von Abfrage, in der Tat, wenn Sie eine Auflösung sind Kanal für Aktivität würden Sie 'SELECT distinct (uc.channel) FROM UseCase uc WHERE uc.activity =?' –

Antwort

0

Sie müssen alle Aggregatausdrücke in der SELECT-Liste einschließen, wenn Sie in Ihrer Abfrage eine GROUP BY-Klausel verwenden.

Ich denke, hier die Abfrage von Hibernate erzeugt

SELECT uc.id, uc.user_case_id,[...] FROM use_case uc WHERE [...] GROUP BY uc.channel_id 

ist (Versuchen Sie, die SQL-Abfrage von Hibernate erzeugt zu überprüfen, ist es immer hilfreich!)