2015-05-22 11 views
17

sto usando Primavera dati JPA (con Hibernate come il mio fornitore di APP) e si vuole definire un metodo exists con una query HQL allegato:primavera dati JPA ed esiste interrogazione

public interface MyEntityRepository extends CrudRepository<MyEntity, String> { 

    @Query("select count(e) from MyEntity e where ...") 
    public boolean existsIfBlaBla(@Param("id") String id); 

} 

Quando eseguo questa query, Ottengo un java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Boolean.

Come deve apparire la query HQL per farlo funzionare? So che potrei semplicemente restituire un valore Long e successivamente controllare il mio codice Java se count > 0, ma questa soluzione alternativa non dovrebbe essere necessaria, giusto?

+1

, ovviamente, si potrebbe modificare la tua ricerca JPQL per restituire un valore booleano ... non restituendo "count (e)" e invece di restituire un espressione booleana –

risposta

29

penso che si può semplicemente cambiare la query per restituire valore booleano come

@Query("select count(e)>0 from MyEntity e where ...") 

PS: Se si sta verificando esiste sulla base di primario valore chiave CrudRepository già exists(id) metodo.

+0

Grazie per il puntatore a 'exists (id)', ma la mia clausola where contiene alcuni vincoli complessi ... –

+4

'count (e)> e' probabilmente funzionerà solo con determinati database (es. Oracle). Con DB2 non funziona e dovrai usare 'select case when count (e)> 0 quindi true else false end da Entity e' –

2

nel mio caso non ha funzionato come seguire

@Query("select count(e)>0 from MyEntity e where ...") 

È possibile restituire come valore booleano con i seguenti

@Query(value = "SELECT CASE WHEN count(pl)> 0 THEN true ELSE false END FROM PostboxLabel pl ...") 
5

Poiché i dati di primavera 1.12 è possibile utilizzare la query di esempio per functionnality estensione dell'interfaccia QueryByExampleExecutor (lo JpaRepository già lo estende).
quindi è possibile utilizzare questa query (tra gli altri):

<S extends T> boolean exists(Example<S> example); 

consideri un'entità MyEntity che, come una proprietà name, si vuole sapere se un soggetto con quel nome esiste, ignorando così, allora la chiamata a questo metodo può assomigliare a questo:

//The ExampleMatcher is immutable and can be static I think 
ExampleMatcher NAME_MATCHER = ExampleMatcher.matching() 
      .withMatcher("name", GenericPropertyMatchers.ignoreCase()); 
Example<MyEntity> example = Example.<MyEntity>of(new MyEntity("example name"), NAME_MATCHER); 
boolean exists = myEntityRepository.exists(example); 
+0

Non molto rilevante nel mio caso dato che la mia query è in HQL –

0

Oltre alla risposta accettata, sto suggerendo un'altra alternativa. Utilizzare QueryDSL, creare un predicato e utilizzare il metodo exists() che accetta un predicato e restituisce Booleano.

Un vantaggio con QueryDSL è che è possibile utilizzare il predicato per clausole where complicate.

48

Spring Data JPA 1.11 ora supporta la proiezione exists nella derivazione di query repository.

Vedere la documentazione here.

Nel tuo caso la seguente funzionerà:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> { 
    boolean existsByFoo(String foo); 
} 
+1

Se aggiungerai un esempio di lavoro sarò felice di andare avanti. –

+0

@StefanHaberl Ho incluso un esempio. –

+0

In realtà stavo chiedendo come formulare la query HQL ... –