Room中DAO接口@Query的CASE WHEN可选参数定义方法问询
解决方法
你的问题核心是SQL中的parameter没有正确绑定到DAO方法的入参,JPA的@Query需要通过:参数名来引用方法定义的参数,具体修正步骤如下:
修正@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);无需额外定义private变量
DAO方法的第二个参数int parameter就是用来接收排序规则的入参,调用这个方法时直接传入对应的值(0=时间降序,1=时间升序,2=单词名降序,3=单词名升序)即可,不需要在DAO接口里定义private int parameter。调用示例(业务层)
比如在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
相关产品推荐
相关产品推荐

