現場では@Select
などを使用し静的SQL部分のみ担当しているため、動的に記述する際はどのように書くのか気になり個人メモ。
現場のようにテキストブロックで記述。
環境
MacBook Air M1
Intellij
Java21
@Select
で記述する場合
Mapper.Java
@Select("""
<script>
SELECT * FROM todos
<where>
<if test="id != null and 0 < id">
id = #{id}
</if>
<if test="id == null or id <= 0">
id = 1
</if>
</where>
</script>""")
ToDo selectById(@Param("id") Integer id);
個人的には見づらい。
@SelectProvider
動的に書くなら@SelectProvider
というものがあると知り簡易コードで記述。
Mapper.Java
@SelectProvider(type = Test.class, method = "select")
ToDo selectById(@Param("id") Integer id);
Test.Java
public class Test {
public String select(Integer id){
return """
SELECT * FROM todos %s"""
.formatted((id != null && 0 < id )? "WHERE id = #{id}" : "WHERE id = 1")
.stripTrailing();
}
}
stripTrailing()はいらないと思いますが、おまじないで使用。
見やすいかは微妙ですね。