В моем проекте я использовал проекции , как показано ниже:
@Repository
public interface PeopleRepository extends JpaRepository<People, Long> {
@Query(value = "SELECT p.name AS name, COUNT(dp.people_id) AS count " +
"FROM people p INNER JOIN dream_people dp " +
"ON p.id = dp.people_id " +
"WHERE p.user_id = :userId " +
"GROUP BY dp.people_id " +
"ORDER BY p.name", nativeQuery = true)
List<PeopleDTO> findByPeopleAndCountByUserId(@Param("userId") Long userId);
@Query(value = "SELECT p.name AS name, COUNT(dp.people_id) AS count " +
"FROM people p INNER JOIN dream_people dp " +
"ON p.id = dp.people_id " +
"WHERE p.user_id = :userId " +
"GROUP BY dp.people_id " +
"ORDER BY p.name", nativeQuery = true)
Page<PeopleDTO> findByPeopleAndCountByUserId(@Param("userId") Long userId, Pageable pageable);
}
// Interface to which result is projected
public interface PeopleDTO {
String getName();
Long getCount();
}
Поля из проецируемого интерфейса должны совпадать с полями в этой сущности.В противном случае отображение поля может нарушиться.
Также, если вы используете нотацию SELECT table.column
, всегда определяйте псевдонимы, совпадающие с именами из объекта, как показано в примере.
В вашем случае измените @Query
, как показано ниже:
@Query(value = "SELECT new
SUM(s.no_of_shares) AS sum,COUNT(*) AS count FROM
shareholders s WHERE s.attend=true", nativeQuery = true)
MetricDTO getMetrics();
И создайте interface
MetricDTO
, как показано ниже:
public interface MetricDTO {
Integer getSum();
Long getCount();
}
Также убедитесь, что тип возвращаемого значения getSum()
и getCount()
является правильным, это может варьироваться в зависимости не отбазы данных.