You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Room中DAO接口@Query的CASE WHEN可选参数定义方法问询

解决方法

你的问题核心是SQL中的parameter没有正确绑定到DAO方法的入参,JPA的@Query需要通过:参数名来引用方法定义的参数,具体修正步骤如下:

  1. 修正@Query中的CASE WHEN条件
    把SQL里的parameter = 0这类写法改成:parameter = 0,让JPA明确要引用方法传入的parameter参数:

    @Query("SELECT * FROM words WHERE childId = :childId ORDER BY " +
           "CASE WHEN :parameter = 0 THEN dateTime END DESC, " +
           "CASE WHEN :parameter = 1 THEN dateTime END ASC, " +
           "CASE WHEN :parameter = 2 THEN wordName END DESC, " +
           "CASE WHEN :parameter = 3 THEN wordName END ASC")
    List<Word> findWord(int childId, int parameter);
    
  2. 无需额外定义private变量
    DAO方法的第二个参数int parameter就是用来接收排序规则的入参,调用这个方法时直接传入对应的值(0=时间降序,1=时间升序,2=单词名降序,3=单词名升序)即可,不需要在DAO接口里定义private int parameter。

  3. 调用示例(业务层)
    比如在Service层调用该DAO方法:

    // 按时间降序查询(传入parameter=0)
    List<Word> timeDescWords = wordDao.findWord(1001, 0);
    // 按单词名升序查询(传入parameter=3)
    List<Word> nameAscWords = wordDao.findWord(1001, 3);
    

补充:如果参数名和方法参数名不一致,可通过@Param注解显式绑定,可读性更强:

@Query("SELECT * FROM words WHERE childId = :childId ORDER BY " +
       "CASE WHEN :sortType = 0 THEN dateTime END DESC, ...")
List<Word> findWord(@Param("childId") int childId, @Param("sortType") int parameter);

内容的提问来源于stack exchange,提问作者YoshioK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:12:57