Progettazione di complessi costruttori di query in java / jpa / hibernate

1

Ho bisogno di creare query sql complesse in modo programmatico, in base a condizioni di filtro di grandi dimensioni.

Ad esempio, di seguito sono riportate alcune condizioni di filtro campione / ipotetico, in base alle quali ho bisogno di recuperare gli utenti

Paese: india

Stati: Andhra Pradesh (AP), Gujarat (GUJ), karnataka (KTK)

Distretti: tutti i distretti in AP tranne 3 distretto, 5 qualsiasi distretto da GUJ, tutti i distretti da KTK tranne 1 distretto

Città: tutte le città in AP, tutte le città tranne alcune, includono solo 50 città specifiche da KTK

Villaggi: condizioni simili come sopra con combinazioni diverse ...

Attualmente, abbiamo un generatore di query, che è di natura molto complessa e non facile da modificare / re-factory per miglioramenti. Quindi, pensando di riprogettarlo completamente.

Qualche suggerimento su come costruire questo tipo di costruttori di query complessi a livello di programmazione utilizzando alcune best practice / modelli di deisgn?

    
posta Ramraj Edagutti 14.04.2012 - 06:21
fonte

2 risposte

2

Con siluri la tua query potrebbe apparire come questa

 public List<User> findUsers() {
    User from = from(User.class);
    City city = innerJoin(from.getCity());
    with(city.getCode()).in("one", "two").or(city.getCode()).notIn("three", "four");
    District district = innerJoin(city.getDistrict());
    with(district.getCode()).notIn("exclude1", "exclude2");
    State state = innerJoin(district.getState());
    with(state.getCode()).eq("AP").or(state.getCode()).eq("GUJ").or(state.getCode()).eq("KTK");
    with(state.getCountry().getCode()).eq("india");

    return select(from).list(manager);
}

Spingo su Github l'esempio se vuoi dare un'occhiata link

    
risposta data 27.04.2012 - 03:33
fonte
0

Sono sicuro che le tue domande possono essere divise in "N" diversi tipi di query; PER ESEMPIO. alcune domande per la posizione geografica, alcune per i conteggi, ecc.

Se il tuo database supporta la selezione da viste, perché non ne definisci uno o più visualizzazioni per ogni tipo di query, quindi fare una SELECT dalla vista per filtrare in base al parametro per quella vista?

Potresti anche essere in grado di rinominare le colonne nella vista per standardizzare parametri di ricerca passati dall'applicazione: E.G. in un caso lo STATO potrebbe essere PARAM1, CITY potrebbe essere PARAM2, in un altro caso, STATE potrebbe essere PARAM1, ZIPCODE potrebbe essere PARAM2. Le viste con gli stessi nomi di colonne salveranno i tuoi moduli devono essere completamente diversi. (Tu può avere una tabella di ricerca che mappa le viste e i parametri; questo ti permetterà di aggiungere facilmente nuovi tipi di ricerche).

Ad esempio, SEARCH1 contiene PARAM1 e PARAM2; PARAM1 è STATO e PARAM2 è città e il nome e i parametri della vista per SEARCH1 sono tutti memorizzati in una tabella di ricerca.

Questo potrebbe renderti più facile scrivere il tuo applicazione; puoi avere un modulo per ogni tipo di visualizzazione ecc.

    
risposta data 05.05.2012 - 02:04
fonte

Leggi altre domande sui tag