バックエンド

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

set-parameter-enum-list

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

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

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難しい!(でも便利だから覚えておこうね!)