Mysql Hibernate本机查询:java.sql.SQLException:操作数应包含1列

Mysql Hibernate本机查询:java.sql.SQLException:操作数应包含1列,mysql,hibernate,jpa,thymeleaf,Mysql,Hibernate,Jpa,Thymeleaf,如果您能检查一下,我将不胜感激。我试图使查询参数成为可选参数,但操作数计数有问题,因为它是一个列表 这是我的密码: public static final String FETCH_FILTERING = "select * from arbor.product where 1=1 "; public static final String FETCH_FILTERING_COLOR = "and ((:colors) is null or color in (:colors)) ";

如果您能检查一下,我将不胜感激。我试图使查询参数成为可选参数,但操作数计数有问题,因为它是一个列表

这是我的密码:

public static final String FETCH_FILTERING = "select * from arbor.product where 1=1 ";
    public static final String FETCH_FILTERING_COLOR = "and ((:colors) is null or color in (:colors)) ";
    public static final String FETCH_FILTERING_GENDER = "and ((:genders) is null or gender in (:genders)) ";
    @Query(value = FETCH_FILTERING+FETCH_FILTERING_COLOR+FETCH_FILTERING_GENDER, nativeQuery = true)
    List<Product> findByColorsAndGenders(@Param("colors")List<String> colors, @Param("genders")List<String> genders);

谢谢您的时间。

从中的
中删除额外的
括号

请确保您的参数没有任何额外的括号

注意:

在('2','1','3')中选择'1';结果:1(正确)

在(('2','1','3')中选择'1';结果:[Err]1241-操作数应包含1列

“并且(:colors)为空”这是错误的表达式,mysql对:colors一无所知 应该是

public static final String FETCH_FILTERING = "select * from arbor.product where 1=1 ";
    public static final String FETCH_FILTERING_COLOR = "and (color is null or color in (:colors)) ";
    public static final String FETCH_FILTERING_GENDER = "and (gender is null or gender in (:genders)) ";
    @Query(value = FETCH_FILTERING+FETCH_FILTERING_COLOR+FETCH_FILTERING_GENDER, nativeQuery = true)
    List<Product> findByColorsAndGenders(@Param("colors")List<String> colors, @Param("genders")List<String> genders);
public static final String FETCH_FILTERING=“select*from arbor.product,其中1=1”;
公共静态最终字符串FETCH_FILTERING_COLOR=“and(COLOR为null或COLOR in(:colors))”;
公共静态最终字符串FETCH_FILTERING_GENDER=“and(GENDER为null或GENDER in(:genders))”;
@查询(value=FETCH\u FILTERING+FETCH\u FILTERING\u COLOR+FETCH\u FILTERING\u GENDER,nativeQuery=true)
列出findByColorsAndGenders(@Param(“colors”)列出颜色,@Param(“genders”)列出性别);

这可以通过使用COALESCE来完成

这是解决办法

public static final String FETCH_FILTERING_COLOR = "and (COALESCE(:colors) is null or color in (:colors)) ";
COALESCE返回给定列表中的第一个非null元素,如果list为null,则返回null

细节-

Hello Ahmed,如果列表为空,我需要将null替换为0。否则,查询将不返回任何结果。顺便说一句,COALESCE不工作,因为它是一个列表。请从arbor.product中选择*,其中color in(COALESCE(:colors,0))和gender in(COALESCE(:genders,0))“不要理解你的意思,如果你是指replace:colors参数,那么你应该在调用method之前处理这个问题。你找到了什么方法吗?”?
public static final String FETCH_FILTERING_COLOR = "and (COALESCE(:colors) is null or color in (:colors)) ";