Как получить результат запроса select с помощью Spring boot - PullRequest
0 голосов
/ 07 октября 2019

У меня есть собственный запрос в Spring-boot, из которого я хочу получить результат с помощью вызова rest, но я делаю что-то не так, что не дает мне результат. Пожалуйста, смотрите мой код ниже

Когда я вызываю репозиторий из контроллера, он дает мне результат, но когда я пытаюсь вызвать через реализацию сервиса, он выдает мне ошибку. Mysql результат для запроса выбора, который я использовал: mysql> select * from cricket_match;

   [{ "id": 1,

    "unique_id": 0,

    "date": "2019-09-29T00:00:00.000Z",

    "match_started": "Yes",

    "team2": "St Lucia Zouks",

    "team1": "Barbados Tridents"

},

{

    "id": 2,

    "date": "2019-08-08",

    "team1": "India",

    "unique_id": 12345,

    "team2": "Australia",

   "match_started": "No"

}]

mysql> SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC;

    [ {"unique_id": 0,

    "date": "2019-09-29T00:00:00.000Z",

    "match_started": "Yes",

    "team2": "St Lucia Zouks",

    "weight": 1,

    "team1": "Barbados Tridents"

},

{

    "date": "2019-08-08",

    "weight": 1,

    "team1": "India",

    "unique_id": 12345,

    "team2": "Australia",

   "match_started": "No"

}]

MatchCount.java

package com.stackroute.matchrecommendationservice.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name = "match_recomendation")
public class MatchCount {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "unique_id")
    private int unique_id;

    @Column(name = "team1")
    private String teamOne;

    @Column(name = "team2")
    private String teamTwo;

    @Column(name = "date")
    private String matchDate;

    @Column(name = "match_started", columnDefinition = "TINYINT(1)")
    private boolean matchStarted;

    @Column(name = "user_id")
    private String userId;    

}

MatchCountRepository.java


import com.stackroute.matchrecommendationservice.domain.MatchCount;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

import java.util.List;
import java.util.Map;

@RepositoryRestResource
public interface MatchCountRepository extends JpaRepository<MatchCount, Integer> {

    List<MatchCount> findByUserId(String userId);

    @Query(value = "SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC", nativeQuery = true)
    public List<Map<String,Object>> findRecommendations();

    @Query(value = "SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC", nativeQuery = true)
    public List<MatchCount> findByRecommendations();
}

MatchRecommendationService.java

package com.stackroute.matchrecommendationservice.service;

import com.stackroute.matchrecommendationservice.domain.MatchCount;
import com.stackroute.matchrecommendationservice.exception.MatchAlreadyExistsException;
import com.stackroute.matchrecommendationservice.exception.MatchNotFoundException;

import java.util.List;

public interface MatchRecommendationService {   

    List<MatchCount> findByRecommendationServiceCall();

}

MatchRecommendationImpl.java

package com.stackroute.matchrecommendationservice.service;

import java.util.List;
import java.util.Optional;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.stackroute.matchrecommendationservice.domain.MatchCount;
import com.stackroute.matchrecommendationservice.exception.MatchAlreadyExistsException;
import com.stackroute.matchrecommendationservice.exception.MatchNotFoundException;
import com.stackroute.matchrecommendationservice.repository.MatchCountRepository;

import com.stackroute.rabbitmq.domain.MatchCountDTO;


@Service
public class MatchRecommendationImpl implements MatchRecommendationService{
    private MatchCountRepository matchCountRepository;

    @Autowired
    public MatchRecommendationImpl(MatchCountRepository matchCountRepository) {
        this.matchCountRepository = matchCountRepository;
    }


    @Override
    public List<MatchCount> findByRecommendationServiceCall() {

        var ResultMatches = (List<MatchCount>)matchCountRepository.findByRecommendations()
        return ResultMatches;
    }
}

MatchRecommendationController.java

package com.stackroute.matchrecommendationservice.controller;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.stackroute.matchrecommendationservice.repository.MatchCountRepository;
import com.stackroute.matchrecommendationservice.service.MatchRecommendationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import com.stackroute.matchrecommendationservice.domain.MatchCount;
import com.stackroute.matchrecommendationservice.exception.MatchAlreadyExistsException;
import com.stackroute.matchrecommendationservice.exception.MatchNotFoundException;
import com.stackroute.matchrecommendationservice.service.MatchRecommendationService;

@CrossOrigin
@RestController
@RequestMapping(path = "/api/v1/matchservice")
public class MatchRecommendationController {

    private ResponseEntity responseEntity;
    private MatchRecommendationService matchRecommendationService;
    @Autowired
    public MatchRecommendationController(final MatchRecommendationService matchService) {
        this.matchRecommendationService = matchRecommendationService;
    }

    @Autowired
    private MatchCountRepository matchCountRepository;  

    //Getting Result
    @GetMapping("/{userId}/matchrecommendations")
    public List<Map<String, Object>> getMatchrecommendations(){
        return matchCountRepository.findRecommendations().stream().collect(Collectors.toList());
    }

    //Not Getting
    @GetMapping("/matchrecommendationnew")
    public String getMyMatchRecommendation(Model model) {
        var results = (List<MatchCount>) matchRecommendationService.findByRecommendationsServiceCall();
        model.addAttribute("results", results);
        return  "results";

    }
}

От контроллера при тестировании в POSTMAN для

http://localhost:8080/api/v1/matchservice/matchrecommendations результат, как показано ниже

[ {"unique_id": 0,

   "date": "2019-09-29T00:00:00.000Z",

   "match_started": "Yes",

   "team2": "St Lucia Zouks",

   "weight": 1,

   "team1": "Barbados Tridents"

},

{

   "date": "2019-08-08",

   "weight": 1,

   "team1": "India",

   "unique_id": 12345,

   "team2": "Australia",

  "match_started": "No"

}]

Для http://localhost:8080/api/v1/matchservice/matchrecommendationnew Я не получаю результат, который должен быть таким же, как указано выше, а ниже - ошибка

{

    "timestamp": "2019-10-07T10:55:54.855+0000",

    "status": 500,

    "error": "Internal Server Error",

    "message": "could not execute query; SQL [SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query",

    "path": "/api/v1/matchservice/matchrecommendationnew"

}

Журнал ошибок:

Hibernate: SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC

2019-10-07 18:03:41.391  WARN 11720 --- [nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S0022

2019-10-07 18:03:41.395 ERROR 11720 --- [nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'id' not found.

2019-10-07 18:03:41.516 ERROR 11720 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query] with root cause



java.sql.SQLException: Column 'id' not found.

               at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.17.jar:8.0.17]

               at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.17.jar:8.0.17]

               at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.17.jar:8.0.17]

               at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.17.jar:8.0.17]

               at com.mysql.cj.jdbc.result.ResultSetImpl.findColumn(ResultSetImpl.java:548) ~[mysql-connector-java-8.0.17.jar:8.0.17]

               at com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:807) ~[mysql-connector-java-8.0.17.jar:8.0.17]

               at com.zaxxer.hikari.pool.HikariProxyResultSet.getInt(HikariProxyResultSet.java) ~[HikariCP-3.2.0.jar:na] ...

Можете ли вы помочь мне, как написать правильный метод контроллера для извлечения данных и тестовый пример Junit, для него. ***

strong text


1 Ответ

0 голосов
/ 07 октября 2019

Спасибо всем, я смог получить результат, когда я изменил тип возвращаемого значения findByRecommendationServiceCall() на List<Map<String,Object>> с List<MatchCount> Результирующие изменения, как показано ниже

MatchCountRepository.java

@Query(value = "SELECT unique_id, date, CASE WHEN match_started = 1 THEN 'Yes' ELSE 'No' END match_started, team1, team2, count(unique_id) AS weight FROM cricket_match GROUP BY unique_id, date, match_started, team1, team2 ORDER BY COUNT(unique_id)DESC", nativeQuery = true)
    public List<Map<String,Object>> findByRecommendations();

MatchRecommendationService.java

List<Map<String,Object>> findByRecommendationServiceCall();

MatchRecommendationImpl.java

```
@Override
public List<Map<String,Object>> findByRecommendationServiceCall() {

    var ResultMatches = (List<Map<String,Object>>)matchCountRepository.findByRecommendations()
    return ResultMatches;
}
```

MatchRecommendationController.java

//Not Getting
    @GetMapping("/matchrecommendationnew")
    public String getMyMatchRecommendation(Model model) {
        var results = (List<Map<String,Object>> matchRecommendationService.findByRecommendationsServiceCall();
        model.addAttribute("results", results);
        return  results;
    }


...