閲覧ありがとうございます。
MyBatisでのnullの挙動で困っているので、ご教授お願い致します。
具体的には、list(1つ目のnull)をMapperでnull判定すると
org.springframework.jdbc.BadSqlGrammarException at SecondTest.java:38
Caused by: org.postgresql.util.PSQLException at SecondTest.java:38
というエラーが出てしまいます。
List.ofでfoodsMapper.findByQuery(new FoodsQuery(List.of("野菜"), null, null))のようにnullでない値を入力すると正常に動作します。
また、ほかの部分をnullにして、ifで書いた場合も正常に動作します。
つまり、Listの部分のみnullのスキップができない状態です。
説明に不備等ございましたら、コメントお願いいたします。
よろしくお願いします。ありがとう
java
1public class SecondTest{ 2 @Autowired 3 private FoodsMapper foodsMapper; 4 5 @Test 6 void test(){ 7 System.out.println(foodsMapper.findByQuery(new FoodsQuery(null, null, "アイス"))); //エラー 8System.out.println(foodsMapper.findByQuery(new FoodsQuery(List.of("氷菓"), null, "アイス"))); //成功する 9 } 10}
mapper.xml
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4<mapper namespace="curriculum.mapper.FoodsMapper"> 5 <select id="findByQuery" resultType="curriculum.domain.FoodsQuery"> 6 Select 7 * 8 From 9 foods 10 Where 11 <if test = "types != null" > 12 AND type IN 13 <foreach item="item" index="index" collection="types" 14 open="(" separator="," close=")" > 15 #{item} 16 </foreach> 17 </if> 18 <if test="limit != null"> 19 AND price <![CDATA[ <= ]]> #{limit} 20 </if> 21 <if test="word != null"> 22 AND name LIKE CONCAT('%', #{word}, '%') 23 </if> 24 </select> 25</mapper>
java
1@Mapper 2public interface FoodsMapper{ 3 List<Map<String, Object>> findByQuery(FoodsQuery param); 4}
java
1@Data 2public class FoodsQuery { 3 @Column(nullable = false) 4 public List<String> types; 5 public Integer limit; 6 public String word; 7 8 public FoodsQuery(){ 9 } 10 11 public FoodsQuery(List<String> types, Integer limit, String word) { 12 this.types = types; 13 this.limit = limit; 14 this.word = word; 15 } 16}
psql
1create table foods 2( 3 id SERIAL, 4 name text NOT NULL, 5 type text NOT NULL, 6 price integer NOT NULL 7); 8 9insert into foods (name, type, price) 10values ('りんご', '果物', 100), 11 ('いちご', '果物', 500), 12 ('西瓜', '果物', 2000), 13 ('じゃがいも', '野菜', 150), 14 ('白菜', '野菜', 300), 15 ('かぼちゃ', '野菜', 1000), 16 ('チョコレート', '菓子', 200), 17 ('バニラアイス', '氷菓', 300), 18 ('抹茶アイス', '氷菓', 300), 19 ('いちごアイス', '氷菓', 300), 20 ('雪見だいふく', '氷菓', 200);
回答2件
あなたの回答
tips
プレビュー