Query dinamica dal livello vista

0

Nel mio attuale lavoro stanno definendo una nuova architettura aziendale per lo sviluppo di java. È qualcosa del genere:

  • ProjectView: livello vista JSF. Utilizza delegati sul livello ProjectClient.
  • ProjectClient: definisce i delegati e le facciate. Lo fa per cercare gli EJB sul livello aziendale.
  • ProjectBusiness: implementa le facciate definite dal livello client come EJB remoti. Contiene anche il modello e il livello DAO.

Il livello aziendale associa le entità alle DTO in modo che il client e la vista siano a conoscenza solo delle cloche di DTO.

La mia preoccupazione

Diciamo che abbiamo un'entità Car con attributi horsePower, numberOfDoors, engineType e releaseDate. Ora, abbiamo bisogno di cercare le auto con 3 porte e più di 120 CV. Con la visione iniziale dell'architettura dovrei scrivere le funzioni necessarie in tutti i livelli che portano questo agli argomenti.

Ma se ho bisogno di 3 porte e più di 120 CV o di un motore diesel? La risposta è stata: costruire un'altra funzione. Quello è nel delegato, nell'interfaccia della facciata, nella facciata impl e nel dao.

Ma le nostre entità non hanno 4 campi. Più di 30. IMHO sarà il caos e le persone moriranno quando inizieremo a scrivere app complete, con centinaia di funzioni dappertutto. La modifica del modello non è un'opzione.

La mia soluzione

Ho creato un prototipo ispirato in queryDsl per creare query dinamiche dalla vista che segue il pattern layer in modo da poter scrivere qualcosa come questo in un bean manager da JSF. È necessario creare solo una classe nel livello ProjectClient.

ClientQuery query = new ClientQuery();
QCar qcar = QCar.qcar;
query.and(qcar.model.eq(model)).and(qcar.horsePower.get(minumuHp));
return carService.searchCars(query);

Il prototipo mantiene separati i livelli e il livello dao può scegliere con il generatore di query da utilizzare in base a una query generica.

La mia domanda

Questo approccio ha senso? Non ho trovato nulla su questo argomento quindi sto affermando di pensare che forse è un anti-modello o un qualche tipo di cattiva pratica. Se ha senso, c'è qualche struttura / libreria o modello per guardare oltre?

Ho caricato il prototipo su Github e posso condividere il link se richiesto.

    
posta Guillermo Gefaell 16.10.2015 - 22:15
fonte

1 risposta

0

Nel caso semplice puoi usare SearchCriteria dto:

class CarSearchCriteria {
   private integer horsePower;
   private integer numberOfDoors;
   private String model;
   // other needed parameters
   // getters/setters
}
CarSearchCriteria criteria = new CarsSearchCriteria()
    .withModel(model)
    .withHorsePower(minHorsePower);
return carService.searchCars(criteria);

Nel caso complesso puoi utilizzare le tue query dinamiche (è schema di progettazione dei criteri )

In più di casi complessi, le query dinamiche non ti aiuteranno. Sarà più complesso di sql chiamato con metodo di facciata.

Guarda il prossimo caso estremo. Ovviamente è un cattivo progetto posizionare tali cose in un livello di vista:

String sqlQuery = "SELECT * from Car where model = ? AND horsePower > ?"
Object[] params = new Object[] {model, horsePower} // your parameters
return searchService.searchEntity(query, params, Car.class);

Ma chiediti: vuoi davvero posizionare le query dinamiche in un livello di visualizzazione?

    
risposta data 19.10.2015 - 17:12
fonte

Leggi altre domande sui tag