ふりぶろぐ
Web Engineer's Blog
Java

jpa.em().createNativeQuery(…). setParameter()でEnumのListを使いたい

Java

結構ハマったので書き残しておきます。

概要

JPAでネイティブクエリを扱うときにjpa.em().createNativeQuery(…)というメソッドを使いました。

そのパラメータとしてEnumのListを使いたかったのですが、普通にセットするだけだと結果が0件になってしまいました。

いろいろ試してみた結果、一度、String型のList(私はSetを使いました)に変換する必要がありました。

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

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

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

:sizeListの部分を()で囲うとエラーになるみたいなのも見たけど、私の環境では大丈夫でした。

()なしでも動くのかもしれません。

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();
    }

まとめ

エラーにはならないものの、jpa.em().createNativeQuery(…). setParameter()ではEnumを扱えないみたいですね。

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

なかなか苦労しました。

JPAは難しい。

ABOUT ME
りーふ
たまにブログを書いてるWebエンジニア。 サーバーサイドメインでインフラとフロントエンドもたまにやります。 Javaが得意。 Play Frameworkが好き。 本業は迷惑をかけない程度に手を抜くスタイル。 意識高い系は苦手。