Il modo più semplice per utilizzare gli oggetti come filtri per le query

0

Sto appena iniziando un mio nuovo progetto per piccoli animali domestici. Ho iniziato il progetto utilizzando un modello familiare per utilizzare gli oggetti come "filtri" nelle query SQL. Non sono mai stato molto contento della sua facilità d'uso, ma alla fine l'ho più o meno accettato dopo averlo trapanato nella mia testa dai colleghi.

L'esempio che segue evidenzia con speranza la mia preoccupazione. Soprattutto per quanto riguarda le dimensioni. Tuttavia, detto questo, vedo anche i punti di forza di questo modello che potrebbero metterlo a favore dell'uso continuato.

Sto cercando alcune opinioni se dovessi continuare come ho sempre o se c'è davvero un modo più semplice per farlo. O utilizzando un modello diverso o in qualche modo "automatizza" il processo.

Tieni presente che il seguente è solo un esempio e non è in uso.

public static User getUser(User filter) throws UserControllerException {
    String sql, sqlFilter = "";
    User user = null;

    try {
        Connection con = DataSource.getInstance().getConnection();

        if (filter.getCorp() != null) sqlFilter += " AND corp_id = ?";
        if (!filter.isNew()) sqlFilter += " AND user_id = ?";
        if (filter.getUsername() != null) sqlFilter += " AND username = ?";
        if (filter.getPasswordHash() != null) sqlFilter += " AND password_hash = ?";
        if (filter.getFirstName() != null) sqlFilter += " AND first_name = ?";
        if (filter.getLastName() != null) sqlFilter += " AND last_name = ?";
        if (filter.getPhoneNumber() > 0) sqlFilter += " AND phone_number = ?";

        sql = "SELECT * FROM users WHERE 1 = 1 " + sqlFilter;

        PreparedStatement ps = con.prepareStatement(sql);
        int psPos = 0;

        if (filter.getCorp() != null) ps.setLong(++psPos, filter.getCorp().getCorpId());;
        if (!filter.isNew()) ps.setLong(++psPos, filter.getUserId());
        if (filter.getUsername() != null) ps.setString(++psPos, filter.getUsername());
        if (filter.getPasswordHash() != null) ps.setString(++psPos, filter.getPasswordHash());
        if (filter.getFirstName() != null) ps.setString(++psPos, filter.getFirstName());
        if (filter.getLastName() != null) ps.setString(++psPos, filter.getLastName());
        if (filter.getPhoneNumber() > 0) ps.setLong(++psPos, filter.getPhoneNumber());

        ResultSet rs = ps.executeQuery();

        if (rs.next()) {
            user = new User(
                    rs.getLong("user_id"),
                    new Corporation(rs.getLong("corp_id"), null),
                    rs.getString("username"),
                    rs.getString("password_hash"),
                    rs.getString("first_name"),
                    rs.getString("last_name"),
                    rs.getLong("phone_number")
            );
        }

    } catch (IOException e) {
        throw new UserControllerException(e.getMessage(), e);
    } catch (SQLException e) {
        throw new UserControllerException(e.getMessage(), e);
    }
    return user;
}
    
posta KG Christensen 23.04.2014 - 23:15
fonte

2 risposte

1

Vorrei iniziare creando il filtro SQL String all'interno dell'oggetto filter stesso (cioè scrivendo un metodo GetSqlFilter() sulla classe Filter ), in modo da avere accesso ai membri interni di Filter , senza dover chiamare tutte quelle funzioni membro.

    
risposta data 23.04.2014 - 23:21
fonte
0

È possibile utilizzare la riflessione per ottenere le varie proprietà e campi in un elenco, scorrere l'elenco e determinare l'output corretto per l'istruzione del filtro. Il reflection è lento rispetto al recupero diretto di una proprietà, all'accesso ai membri interni della classe o all'accesso ai campi.

    
risposta data 24.04.2014 - 02:36
fonte

Leggi altre domande sui tag