#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);