SQL агрегация GROUP BY и COUNT весной JPA - PullRequest
1 голос
/ 23 апреля 2020

У меня есть таблица SQL:

@Table(name = "population_table")
public class Population {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String country;
  private String state;
  private String area;
  private String population;
}

Я хочу получить счетчик, группируясь по стране и штату с выходным классом Список счетчиков:

  private static class Count {
    private String country;
    private String state;
    private long count;
  }

Я знаю, что запрос

SELECT country, state, Count(*)
FROM population_table
GROUP BY country, state

Но я хочу сделать это с использованием спецификации JPA. Как я могу добиться этого с помощью спецификации JPA при весенней загрузке?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Этого можно добиться, используя Проекции JPA Spring Data в JPA Spring Data.

Создайте пользовательский метод Repository как

@Repository
public interface PopulationRepository extends JpaRepository<Population, Long> {

@Query("select new com.example.Count(country, state, count(*) )
       from Population p
       group by p.country, p.state")
public List<Count> getCountByCountryAndState();

}

Также необходимо определить спецификатор c в классе Count, который будет обрабатывать эту проекцию

private static class Count {
 private String country;
 private String state;
 private long count;

 //This constructor will be used by Spring Data JPA 
 //for creating this class instances as per result set
 public Count(String country,String state, long count){
   this.country = country;
   this.state = state;
   this.count = count;
 }
}
0 голосов
/ 23 апреля 2020

Вы можете использовать интерфейс JpaRepository. Пример:

@Repository
public interface PopulationRepository extends JpaRepository<Population, Long> {

    public int countAllByCountryAndState(String countryName, String stateName);

}

И к вашим услугам:

@Service
@Transactional
public class PopulationService {

    @Autowired
    private PopulationRepository populationRepository;

    public int countPopulationByCountryAndState(String countryName, String stateName) { 

         return populationRepository.countAllByCountryAndState(countryName, stateName);
    }

}  

Извините, я сделал ошибку, это может быть проще. Я отредактировал свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...