2016-03-31 7 views
27

Ich entwickle eine Spring Boot-Anwendung mit Spring Data JPA. Ich verwende eine benutzerdefinierte JPQL-Abfrage, um nach einem Feld zu gruppieren und die Anzahl zu erhalten. Folgendes ist meine Repository-Methode.Zurückgeben eines benutzerdefinierten Objekts aus einer Spring Data JPA GROUP BY-Abfrage

@Query(value = "select count(v) as cnt, v.answer from Survey v group by v.answer") 
public List<?> findSurveyCount(); 

Es funktioniert und das Ergebnis wird wie folgt erhalten:

[ 
    [1, "a1"], 
    [2, "a2"] 
] 

Ich möchte so etwas bekommen:

[ 
    { "cnt":1, "answer":"a1" }, 
    { "cnt":2, "answer":"a2" } 
] 

Wie kann ich das erreichen?

Antwort

61

Schritt 1: Deklarieren Sie eine einfache Bean-Klasse

package com.path.to.class; 

public class SurveyAnswerStatistics { 
    private String answer; 
    private Long cnt; 

    public SurveyAnswerStatistics(String answer, Long cnt) { 
    this.answer = answer; 
    this.count = cnt; 
    } 
} 

Schritt 2: Return Bohne Instanzen aus dem Repo sitory Methode

@Query("SELECT " + 
     " new com.path.to.class.SurveyAnswerStatistics(v.answer, count(v)) " + 
     "FROM " + 
     " Survey v " + 
     "GROUP BY " + 
     " v.answer") 
List<SurveyAnswerStatistics> findSurveyCount(); 
+1

Es funktioniert nicht, Auslösen von Fehler: 'verursacht durch: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable Um die Klasse [SurveyAnswerReport] zu lokalisieren [wählen Sie den neuen SurveyAnswerReport (v.answer, count (v.id)) aus com.furniturpool.domain.Survey v group by v.answer] \t bei org.hibernate.jpa.spi.AbstractEntityManagerImpl. konvertieren (AbstractEntityManagerImpl.java:1750) \t bei org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert (AbstractEntityManagerImpl.java:1677) \t bei org.hibernate.jpa.spi.AbstractEnti ......... .' –

+0

Was ist dieser 'SurveyAnswerReport' in Ihrer Ausgabe? Ich nehme an, Sie haben "SurveyAnswerStatistics" durch Ihre eigene Klasse "SurveyAnswerReport" ersetzt. Sie müssen den vollständig qualifizierten Klassennamen angeben. – Bunti

+7

Die Bean-Klasse muss vollständig qualifiziert sein, dh den vollständigen Paketnamen enthalten. Etwas wie 'com.domain.dto.SurveyAnswerReport'. – manish

5

Diese SQL-Abfrage Rückgabe Liste < Object []> würde.

Sie können es auf diese Weise tun:

@RestController 
@RequestMapping("/survey") 
public class SurveyController { 

    @Autowired 
    private SurveyRepository surveyRepository; 

    @RequestMapping(value = "/find", method = RequestMethod.GET) 
    public Map<Long,String> findSurvey(){ 
     List<Object[]> result = surveyRepository.findSurveyCount(); 
     Map<Long,String> map = null; 
     if(result != null && !result.isEmpty()){ 
      map = new HashMap<Long,String>(); 
      for (Object[] object : result) { 
      map.put(((Long)object[0]),object[1]); 
      } 
     } 
    return map; 
    } 
} 
+1

danke für deine antwort :) –

+1

danke für deine antwort auf diese frage. Es war klar und klar –

+0

@PranavCBalan danke :) – ozgur

1

eine benutzerdefinierte pojo Klasse sagen sureveyQueryAnalytics definieren und speichern Sie die Abfrage

@Query(value = "select new com.xxx.xxx.class.SureveyQueryAnalytics(s.answer, count(sv)) from Survey s group by s.answer") 
List<SureveyQueryAnalytics> calculateSurveyCount(); 
5

Ich weiß, das ist eine alte Frage Wert in Ihrer benutzerdefinierten pojo Klasse zurückgegeben und es wurde bereits beantwortet worden, Aber hier ist ein anderer Ansatz:

0

Ich mag keine Java-Namen in Abfragezeichenfolgen und behandeln Sie es mit einem bestimmten Konstrukt ctor:

@Query("SELECT v.answer as "+PROP_ANSWER+", count(v) as "+PROP_CNT+" FROM Survey v GROUP BY v.answer") 

public class SurveyAnswerStatistics { 
    public static final String PROP_ANSWER = "answer"; 
    public static final String PROP_CNT = "cnt"; 

    private String answer; 
    private Long cnt; 

    public SurveyAnswerStatistics(HashMap<String, Object> values) { 
    this.answer = (String) values.get(PROP_ANSWER); 
    this.count = (Long) values.get(PROP_CNT); 
    } 
} 
Verwandte Themen