2017-12-28 3 views
0

Ich lerne, wie extend Spring CrudRepository Schnittstelle zum Erstellen eines Repository für eine Entität. Aber ich habe Probleme, kompliziertere Abfragen zu implementieren, die Werte verwenden, die nicht fest codiert sind. Hier ist ein künstliches Beispiel. Die HQL ist nicht gültig, aber es zeigt, was ich versuche zu tun:Verwenden von Bezeichnern und Werten von anderen Orten in einem Spring CrudRepository

import mypackage.DogTypeEnum; 
public interface myRepository extends CrudRepository<Dog, Integer> { 
    int oldAge = 10; // years - old for a dog 

    @Query(SELECT dog From Dog dog WHERE dog.age > oldAge and dog.type = DogTypeEnum.poodle 
    public List<Dog> findOldPoodles() 
} 

So im obigen Beispiel, ich versuche, für alle Hunde vom Typ Pudel abzufragen, die über eine bestimmte Altersgrenze sind. Ich möchte weder poodle noch den Wert 10 fest codieren, weil diese Werte auch an anderer Stelle im Code verwendet werden und ich Doppelungen vermeiden möchte. Ich möchte nicht, dass der Benutzer diese Werte auch als Parameter übergibt.

Gibt es eine Möglichkeit, dies zu tun?

+0

, was Sie von Ihnen gemeint Sie nicht wollen, um den Benutzer zu codieren und wollen nicht die Werte als Parameter zu übergeben? Wie und wo werden Sie von diesen Werten erwartet? – pvpkiran

+0

Ich meinte zum Beispiel, dass ich '... WHERE dog.age> oldAge ...' anstelle von '... WHERE dog.age> 10 ...' möchte, weil 'oldAge' eine Variable ist, die woanders deklariert ist (In diesem Fall wird es in der Schnittstelle deklariert, im Fall von 'DogTypeEnum' wurde es importiert), so dass die Logik nicht dupliziert wird. –

Antwort

0

In meinem Fall werde ich nie dieses Problem haben, wenn Sie Ihr Projekt als nächste Paket-Architektur zeigt eine Struktur, werden Sie dieses Problem nicht:

Ansicht (Angular, JSP, JSF .. .) - APP

-Controller - APP

Services - Hauptkern

DAO - Hauptkern

Entities - Main Core

Auf diese Weise machen Sie eine modulare, eskalierbare, wartbare und umfassende Anwendung.

Es spielt keine Rolle, welche Technologie Sie in Ihrer Sicht verwenden, Sie müssen nur die korrekte Methode für den Dienst in Anspruch nehmen.

hier in, auf dem Service-Paket können Sie einen Service zum Beispiel haben:

@Service 
public class ServiceDog extends Serializable { 
    @Autowired 
    private MyRepository myRepository; 

    int oldAge = 10; 

    public List<Dog> findOldPoodles() throws ServicioException { 
    return myRepository.findAllByAgeGreaterThanAndType(oldAge, DogTypeEnum.poodle); 
    } 
} 

Nun könnte man den ganzen Vorteil nutzen Sie verwenden spring-data-jpa reference bekommen oder eine einfachere JPQL Abfrage machen.

Dies ist ein einfaches Beispiel, aber auf diese Weise stellen Sie sicher, dass jedes DAO mit nur einer Entität spricht Service sind diejenigen, die die verschiedenen DAOs anrufen und die notwendigen Maßnahmen für sie ergreifen.

Hoffe, das hilft.

0

Sie könnten eine Schnittstelle erstellen, die das Repository als wie folgt erweitern:

//Only complex querys 
    public interface MyRepositoryCustom { 
    List<Dog> findOldPoodles() 
    } 

// Ihr Repository muss erstreckt sich auf MyRepositoryCustom

public interface MyRepository extends CrudRepository<Dog, Integer>, MyRepositoryCustom { 
    // Declare query methods 
} 

// Komplexere Abfrage

public class MyRepositoryImpl implements MyRepositoryCustom { 

@PersistenceContext 
private EntityManager em; 

public List<Dog> findOldPoodles() { 
    Query query = em.createQuery("SELECT dog From Dog dog WHERE dog.age > :oldAge and dog.type = :type"); 
    query.setParameter("oldAge",10); 
    query.setParameter("type",DogTypeEnum.poodle.name); 

    return query.getResultList(); 
} 
} 

Erinnere dich daran, dass alle Java-Klassen mit einem Großbuchstaben beginnen.

Dieser Link kann Ihnen helfen: Spring repositories

Verwandte Themen