2013-08-23 8 views
13

Non voglio hardcode i valori costanti, preferirei specificarli attraverso una variabile di riferimento.Esiste un modo per utilizzare le costanti nel valore di annotazione Spring Data @Query?

Per esempio, piuttosto che scrivere la query successiva:

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

..Io vorrebbe estrarre il valore hardcoded '1' e scrivere qualcosa di simile:

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

C'è un modo per specificare costanti come nel secondo esempio all'interno di query di dati primaverili?

risposta

5

Si consiglia di creare un Enum e un campo di quell'enumerazione sull'entità.

public enum UserModelStatus{ 
    ACTIVE, INACTIVE 
} 

public UserModel{ 

    /* Other fields ommitted */ 

    @Enumerated(EnumType.STRING) 
    private UserModelStatus status; 

    /* Get/Set Method */ 
} 

Quindi creare il tuo metodo di deposito:

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

    public List<UserModel> findByStatus(UserModelStatus status); 

} 

Utilizzo di dati primavera non sarà nemmeno bisogno di scrivere JPQL basta chiamare il metodo come:

@Autowired 
    UserModelRepository userModelRepository; 

    public void someMethod(){ 
     List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE); 
    } 
+1

Come posso negare facilmente findByStatus (stato UserModelStatus)? Voglio dire ottenere tutto userModel dove UserModelStatus è ** non ** status? – stratosgear

+1

findByStatusNot (stato UserModelStatus) –

+0

Questo mostra la piena potenza dei dati di primavera. Attenersi ad esso per domande semplici, non è necessario scrivere sql da soli. – membersound

1

Quando si desidera utilizzare le costanti direttamente nella tua annotazione @Query puoi scrivere qualcosa come:

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

Ciò restituirebbe un errore che dice che il valore dell'attributo deve essere costante. – Cleankod

+0

Questo è quello che ho detto. Questa risposta riguarda l'uso delle costanti nell'annotazione @Query. – h3nrik

+1

Sì ma COSTANTE + COSTANTE non è più costante :) Di qui l'errore. – Cleankod

13

si deve utilizzare il nome completo della classe in questo modo:

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

La cosa negativa è però che un IDE non riconosce questo come un uso del UserModel di classe. L'unico vantaggio è che puoi mantenere il valore in un posto, il che è sufficiente la maggior parte del tempo.

+1

questo solleva un'eccezione che 'com non definito' .. Almeno per il mio – bert

+0

Hai applicato il nome del pacchetto completo per il tuo scopo? Voglio dire che devi indicare la classe corretta e esistente con il suo nome completo. – Cleankod

+0

Sì, l'ho fatto. Ho risolto il problema nel passaggio tra i valori enumerati da confrontare. non elegante, ma funzionante – bert

0

La risposta a questo sembra essere "No" per una soluzione standard.

Alcune implementazioni JPA possono avere soluzioni proprie ma ibernate perché non sembrano e non sembrano supportare i metodi suggeriti da altre risposte qui.

2

Usa come segue:

Nell'interfaccia repository, definire una costante come segue:

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

Ora è possibile utilizzare

@Query(value=USER_QUERY) 
0

Sono riuscito a utilizzare la classe String costante in query tramite l'operatore SpEL T(), che consente di accedere a metodi e costanti statici su una determinata classe. Per String devo avvolgere un'espressione con virgolette singole ('), probabilmente sarà necessario anche per te (se si verifica QuerySyntaxException).

provare qualcosa di simile,

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

Nota: in qualche modo non funziona se si utilizza UserModel invece di # {# entityName}.

In docs suo brevemente accennato, vedi: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based

Non so da quando questo è supportato, ho la primavera-dati-JPA 1.4.3, la primavera-quadro 3.2.17

Problemi correlati