Jpa возвращает более одного результата, хотя в базе данных находится только одна строка - PullRequest
0 голосов
/ 11 июня 2019

Я выполняю различные запросы JPA в виде

Float getDepositVolumeByDepositIdDepositAndSpeciesIdSpeciesAndRangeIdRangeAndSubRangeIdSubrange(Long idDeposit, Long idSpecies, Long idRange, Long idSubRange); // this is one of the methods that fail
@Query("select stock.depositVolume from Stock s where s.deposit.idDeposit = ?1 and s.species.idSpecies = ?2 and s.range.idRange = ?3 and s.subrange.idSubrange = ?4")
Float getVolumeByDepositIdDepositAndSpeciesIdSpeciesAndRangeIdRangeAndSubRangeIdSubrange(Long idDeposit, Long idSpecies, Long idRange, Long idSubRange); // this one is just for ilustrative purpose and throws the exact same error

Эти два запроса являются лишь некоторыми из тех, которые должны возвращать одну строку. Хотя в базе данных есть только одна строка, соответствующая данным, предоставленным для запроса, hibernate выдает следующее сообщение об ошибке:

Результат возвращает более одного элемента

Я включил журнал запросов гибернации, и для первого метода был сгенерирован следующий запрос:

select stock0_volume_stock as col_0_0_ from public.stock stock0_ where stock0_.id_deposit = ? and stock0_.id_species = ? and stock0_.id_range = ? and stock0_.id_sub_range = ? 

с правильно связанными параметрами. Я запустил запрос на PostGres, и он возвращает только одну строку с float.

Стоит отметить, что мое объявление класса:

public interface StockRepository extends QueryDslPredicateExecutro<Stock>, JpaRepository<Stock, long>

Что я закончил, так это изменил эти методы на

List<Stock> findFirstByDepositIdDepositAndSpeciesIdSpeciesAndRangeIdRangeAndSubRangeIdSubrange(Long idDeposit, Long idSpecies, Long idRange, Long idSubRange); // now it justly returns only one row, the first one

Я обычно предполагаю, и, конечно, в предыдущих проектах это наблюдалось, что первый метод должен отображать единственный результат, полученный из базы данных , в ожидаемый float

Мне очень интересно, чем объясняется такое поведение.

1 Ответ

0 голосов
/ 11 июня 2019

Если вы выберете SELECT some-column FROM some-table WHERE ... jpa / hibernate не сможет узнать, что только одна строка соответствует условию, напротив, он должен предполагать, что возвращено много строк, и мое предположениеявляется то, что он всегда использует одну и ту же логику для запроса, подобного этому (при условии, что несколько строк) и что сообщение об ошибке вводит в заблуждение здесь.

Чтобы получить одну строку, вам потребуется запрос с агрегатной функцией, такой как SUM или COUNTкак единственный элемент в предложении SELECT.Возможно, для интереса вы можете попробовать использовать SUM в исходном запросе и посмотреть, возвращает ли он ожидаемый результат.

Может быть, это больше подходит в качестве комментария, чем в ответе, но было бы слишком долго ждать комментария

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