web-dev-qa-db-ja.com

Spring Data @Queryアノテーション値内で定数を使用する方法はありますか?

定数値をハードコーディングしたくないので、参照変数を使用して指定します。

たとえば、次のクエリを書くのではなく、

@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1")

..ハードコードされた値「1」を抽出し、次のように記述したいと思います。

@Query(value = "SELECT u FROM UserModel u WHERE u.status = UserModel.STATUS_ACTIVE")  //doesn't compile

Spring-dataクエリ内の2番目の例のように定数を指定する方法はありますか?

24
Roman

次のような完全修飾クラス名を使用する必要があります。

@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE")

ただし、悪いのは、IDEはこれをクラスUserModelの使用として認識しないことです。唯一の利点は、値を1か所に保持できることです。時間。

24
Cleankod

エンティティにEnumとその列挙型のフィールドを作成することをお勧めします。

public enum UserModelStatus{
     ACTIVE, INACTIVE
}

public UserModel{

    /* Other fields ommitted */

    @Enumerated(EnumType.STRING)
    private UserModelStatus status;

    /* Get/Set Method */
}

次に、リポジトリメソッドを作成します。

@Repository
public interface UserModelRepository extends JpaRepository<UserModel, Long>{

    public List<UserModel> findByStatus(UserModelStatus status);

}

Spring Dataを使用すると、次のようなメソッドを呼び出すだけでJPQLを作成する必要もありません。

   @Autowired
   UserModelRepository userModelRepository;

   public void someMethod(){
       List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE);
   }
10
Kevin Bowersox

次のように使用します。

リポジトリインターフェイスで、次のように定数を定義します。

public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE;

これで使用できます

@Query(value=USER_QUERY)
6
zdesam

SpEL T()演算子を使用してクエリでクラス文字列定数を使用することができました。これにより、特定のクラスの静的メソッドと定数にアクセスできます。引用符( ')、おそらくあなたにも必要です(QuerySyntaxExceptionが発生した場合)。

このようなものを試してください、

@Query("SELECT u FROM #{#entityName} u " +
       "WHERE u.status = #{T(fully.qualified.path.UserModel).STATUS_ACTIVE}")

注:#{#entityName}の代わりにUserModelを使用すると、どういうわけか機能しません。

簡単に言及されているドキュメントでは、次を参照してください: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based

これがいつサポートされるかわからないので、spring-data-jpa 1.4.3、spring-framework 3.2.17があります。

2
WeGa

これに対する答えは、標準ソリューションでは「いいえ」と思われます。

一部のJPA実装には独自のソリューションがある場合がありますが、1つの休止状態は、他の回答で提案されているメソッドのいずれもサポートしていないようです。

1
cmorris

@Queryアノテーション内で直接定数を使用する場合、次のように記述できます。

@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE)
0
h3nrik