JPA при выдаче именованных параметров запроса

#hibernate #jpa

Вопрос:

В следующем запросе, если я попытаюсь выполнить запрос, указав, например, «488» в качестве возраста. Этот запрос JPA считает его 4 и возвращает результат соответственно, который неверен. Я не знаю, почему JPA обрезает 2-й и третий символы в этом случае. Любые советы были бы великолепны. Я хотел бы вернуть все товары, возраст которых превышает 488 лет (пример). Если я заменю знак больше (>) на знак равно, чем JPA не обрезает никакие символы и возвращает все продукты, возраст которых равен «488».

 @Query("SELECT new com.model.Result(am.product, am.age)"
              "FROM Table am WHERE am.age > :age")
    List<Result> queryResult(@Param("age") String age );
 

Комментарии:

1. Что это за тип Table.am ? Вы сравниваете его со строкой, поэтому он будет сравниваться лексикографически, то "5" > "488" есть верно. Попробуйте изменить тип age аргумента на соответствующий тип.

Ответ №1:

Я предполагаю, что возраст-это тип числа. Тогда вы также должны использовать тот же тип. Например Целое число

 @Query("SELECT new com.model.Result(am.product, am.age)"
          "FROM Table am WHERE am.age > :age")
List<Result> queryResult(@Param("age") int age );
 

Комментарии:

1. Возраст-это Varchar в базе данных.

2. Какую базу данных вы используете?

3. Я использую mysql в качестве базы данных

4. Вопрос в том, почему вы храните числовые значения в varchar. Это основная проблема, потому что mysql сравнивает строки, а не числовое значение. Вам пришлось бы привести возраст к числу, но это невозможно с помощью запроса JPA

5. Вам нужно будет использовать собственный SQL-запрос с приведением, подобным этому ПРИВЕДЕНИЮ(возраст КАК ЦЕЛОЕ ЧИСЛО БЕЗ ЗНАКА).

Ответ №2:

То, что вы видите здесь, — это лексическое сравнение. Если вы хотите, чтобы строки интерпретировались как числа, чтобы их можно было сравнивать численно, вам придется привести:

 @Query("SELECT new com.model.Result(am.product, am.age)"
          "FROM Table am WHERE cast(am.age as integer) > :age")
List<Result> queryResult(@Param("age") int age);