バックエンド

【Java】createNativeQueryのsetParameterでEnumのListを使ってみよう!【JPA】

set-parameter-enum-list
野田竣介

今回はこのような質問をいただきました。

createNativeQueryのsetParameterでEnumのListを使いたいんだけどうまく使えない…

EnumのListを普通にセットするだけだと結果が0件になってしまいました。

そこで今回はこちらの質問について解説していきます!

結論:StringのListに変換する必要あり!

結論から言うと、EnumのListをStringのListに変換します。

サンプルなので動作確認はできてないけど、こんな感じで動くはず!

public static List<Clothes> sample(List<Size> sizeListEnum) {
        Set<String> sizeList = sizeListEnum.stream().map(Enum::toString).collect(Collectors.toSet());
        return Jpa.em().createNativeQuery(
                "select * from clothes where size in (:sizeList)", Clothes.class)
                .setParameter("sizeList", sizeList)
                .getResultList();
    }

ClothesがEntity、SizeがEnumの想定です。

EnumのListをStringのList(Set)に変換してからsetParameter()に渡してあげます。

:sizeListの部分を()で囲うとエラーになるという記事も見ましたが私の環境では大丈夫でした。
バージョンによっては()なしでも動くのかも?

まとめ

EnumのListをStringのListに変換してから使いましょう!

public static List<Clothes> sample(List<Size> sizeListEnum) {
        Set<String> sizeList = sizeListEnum.stream().map(Enum::toString).collect(Collectors.toSet());
        return Jpa.em().createNativeQuery(
                "select * from clothes where size in (:sizeList)", Clothes.class)
                .setParameter("sizeList", sizeList)
                .getResultList();
    }

2行目と5行目が重要!

あとがき

これは私も結構ハマりました(笑)

エラーにはならないものの、createNativeQueryのsetParameterではEnumは扱えないみたいですね。

配列にしてみたり、カンマ区切りの文字列にしてみたり、いろいろ試しましたがこれが正解みたいです。

JPA難しい!(でも便利だから覚えておこう!)

記事URLをコピーしました