true query jparepository example data java spring jpql spring-data

java - jparepository - spring data jpa join query example



¿Hay alguna forma de usar constantes dentro del valor de anotación Spring Data @Query? (6)

No quiero codificar valores constantes, prefiero especificarlos a través de una variable de referencia.

Por ejemplo, en lugar de escribir la siguiente consulta:

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

..Me gustaría extraer el valor codificado en "1" y escribir algo como:

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

¿Hay una manera de especificar constantes como en el segundo ejemplo dentro de las consultas de datos de primavera?


Cuando desee utilizar constantes directamente dentro de su anotación @Query, puede escribir algo como:

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


La respuesta a esto parece ser ''No'' para una solución estándar.

Algunas implementaciones de JPA pueden tener soluciones propias, pero la hibernación para una no parece ser y no parece admitir ninguno de los métodos sugeridos por otras respuestas aquí.


Me las arreglé para usar la constante de cadena de clase en la consulta a través del operador SpEL T (), que le da acceso a métodos estáticos y constantes en una clase determinada. Para String tengo que envolver la expresión con comillas simples (''), probablemente también será necesario para usted (si se produce la excepción QuerySyntaxException).

Intenta algo como esto,

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

Nota: de alguna manera no funciona si usa UserModel en lugar de # {# entityName}.

En los documentos mencionados brevemente, consulte: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based

No sé, ya que cuando esto es compatible, tengo spring-data-jpa 1.4.3, spring-framework 3.2.17


Recomendaría crear un Enum y un campo de ese enum en la entidad.

public enum UserModelStatus{ ACTIVE, INACTIVE } public UserModel{ /* Other fields ommitted */ @Enumerated(EnumType.STRING) private UserModelStatus status; /* Get/Set Method */ }

Luego crea tu método de repositorio:

@Repository public interface UserModelRepository extends JpaRepository<UserModel, Long>{ public List<UserModel> findByStatus(UserModelStatus status); }

Usando Spring Data, ni siquiera necesitará escribir JPQL, simplemente llame al método como:

@Autowired UserModelRepository userModelRepository; public void someMethod(){ List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE); }


Tienes que usar un nombre de clase totalmente calificado como este:

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

Sin embargo, lo malo de esto es que un IDE no reconocería esto como un uso de la clase UserModel. La única ventaja es que puede mantener el valor en un solo lugar, que es suficiente la mayor parte del tiempo.


Use de la siguiente manera:

En la interfaz del repositorio, defina una constante de la siguiente manera:

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

Ahora puedes usar

@Query(value=USER_QUERY)