定数値をハードコーディングしたくないので、参照変数を使用して指定します。
たとえば、次のクエリを書くのではなく、
@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番目の例のように定数を指定する方法はありますか?
次のような完全修飾クラス名を使用する必要があります。
@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE")
ただし、悪いのは、IDEはこれをクラスUserModelの使用として認識しないことです。唯一の利点は、値を1か所に保持できることです。時間。
エンティティに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);
}
次のように使用します。
リポジトリインターフェイスで、次のように定数を定義します。
public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE;
これで使用できます
@Query(value=USER_QUERY)
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があります。
これに対する答えは、標準ソリューションでは「いいえ」と思われます。
一部のJPA実装には独自のソリューションがある場合がありますが、1つの休止状態は、他の回答で提案されているメソッドのいずれもサポートしていないようです。
@Queryアノテーション内で直接定数を使用する場合、次のように記述できます。
@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE)