JPQLのQueryでLIMITを使う方法

こんにちは、さるまりんです。

JPQLでPostgreSQLにLIMIT付きでSELECTを投げようとしました。

こんなSQLです。

SELECT * FROM composers ORDER BY id LIMIT 1;

JPQL

@Query("SELECT c FROM Composer c ORDER BY c.id LIMIT 1")

とするとエラーで動きません。

さあどうするか。

簡単にやるには

@Query(value="SELECT * FROM Composer c ORDER BY c.id LIMIT 1", nativeQuery=true)

naitiveQuery=trueにすると、psqlで動くクエリがそのまま使えます。

が、これをするとせっかくJPQLで実装しているのに。。ということがあるみたいです。

さあどうするか。(2回目)

Spring Data JPAを使っているなら

findFirstByOrderById()

のようにすることで、一つ目のデータのみ取得することができます。

クエリがもう少しややこしくて

SELECT * FROM composers WHERE last_name = [姓] ORDER BY id

のようにWHERE句があるのであれば

findFirstByLastNameOrderById(String lastName)

のようにします。

あとはsetMaxResult()を使って、結果の最大数を制限することもできます。

TypedQuery<Student> query = entityManager.create("SELECT c Composer c ORDER BY c.id", Composer.class);
query.setMaxResults(1);

それぞれ利点があると思うので、場合によって使い分けですね。

今回は影響などを考えてnativeQuery=trueで対応しましたが、これで良かったのかしら?
改めてよく考えてみます。

読んでくださってありがとうございました。

それではまた!