Запрос Spring data jpql (в режиме гибернации) не работает в базе данных MySQL Ошибка: 1241

#java #mysql #hibernate #spring-boot #spring-data-jpa

#java #mysql #спящий режим #spring-boot #spring-data-jpa

Вопрос:

Я реализовал фильтр с использованием запроса jpql в spring data JPA.

Я использую этот класс в качестве фильтра;

 @NoArgsConstructor
@Getter
@Setter
@ToString
public class FilterTO {
    private Double priceMin;
    private Double priceMax;
    private List<Long> categories;
    private List<String> brands;

    public FilterTO(Double priceMin, Double priceMax, List<Long> categories, List<String> brands) {
        this.priceMin = (priceMin == null)? 0 : priceMin;
        this.priceMax = (priceMax == null)? Double.MAX_VALUE: priceMax;
        this.brands = (brands == null || brands.isEmpty())? null : brands;
        this.categories = (categories == null || categories.isEmpty())? null : categories;
    }
}
 

И это метод и запрос, которые я использую;

 @Query("SELECT p FROM Product p WHERE "  
            "p.price * (1 - p.discount) BETWEEN :#{#filter.getPriceMin()} AND :#{#filter.getPriceMax()} "  
            "AND ( p.brand IN :#{#filter.getBrands()} OR :#{#filter.getBrands()} IS NULL) "  
            "AND ( p.category.id IN (SELECT DISTINCT c.id FROM Category c "  
            "WHERE c.parent.id IN :#{#filter.getCategories()}) OR p.category.id IN :#{#filter.getCategories()} OR :#{#filter.getCategories()} IS NULL) ")
    Page<Product> findByFilter(@Param("filter") FilterTO filter, Pageable pageable);
 

Это запрос в чистой версии:

 SELECT p FROM Product p WHERE p.price * (1 - p.discount) BETWEEN :#{#filter.getPriceMin()} AND :#{#filter.getPriceMax()} 
AND ( p.brand IN :#{#filter.getBrands()} OR :#{#filter.getBrands()} IS NULL) 
AND ( p.category.id IN (SELECT DISTINCT c.id FROM Category c WHERE c.parent.id IN :#{#filter.getCategories()}) OR p.category.id IN :#{#filter.getCategories()} OR :#{#filter.getCategories()} IS NULL)
 

Поэтому в основном я фильтрую по цене, категориям и брендам. Если список категорий пуст, я его игнорирую, и если список брендов пуст, я его тоже игнорирую.

Этот же запрос отлично работает в H2, но когда мы попытались перейти к работе на MySQL, он выдает следующую ошибку: java.sql.SQLException: операнд должен содержать 1 столбец (ы)

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

1. Я думаю, вам следует указать здесь параграф, ГДЕ ( p.price * (1 — p.discount) МЕЖДУ:#{#filter.getPriceMin()} И:#{#filter.getPriceMax()} )

2. @raviiii1 спасибо за комментарий, я пробовал это, но все равно получаю ту же ошибку

3. Если вы измените уровень ведения журнала в режиме гибернации, вы сможете увидеть запрос, который он фактически отправляет в базу данных. В моем случае есть несколько скобок, в которых нет ни одного, а затем я получаю эту ошибку. Исправление еще не найдено.