для построения динамического запроса с помощью кода Java

#java

#java

Вопрос:

У меня есть один класс сущностей, в котором есть определенные атрибуты tables . Объект этого класса будет заполнен в вспомогательном классе значениями атрибутов . Теперь мне нужен метод, который будет динамически создавать оператор SQL-запроса (отдельный частный метод), запрашивать таблицу (отдельный частный метод) для всех совпадающих строк, сопоставлять выходные результаты (отдельный частный метод) со списком объектов AuditBO

Комментарии:

1. В чем ваш вопрос? Пожалуйста, покажите нам, что вы сделали до сих пор и в каких конкретных задачах вы работаете.

2. Возможно, здесь может помочь какой-то ORM, например, использование Hibernate. Это позволяет вам запрашивать вашу модель.

3. Или, если вам нужны более читаемые операторы и меньше строковой акробатики, вы можете заглянуть в QueryDSL. querydsl.com

Ответ №1:

Надеюсь, это будет полезно.

Когда Table класс инициализируется, все входные значения будут инициализированы. При getSelectQuery вызове метода на основе входных данных будет сформирован запрос select. И populatePreparedSt будет вызван для установки PreparedStatement . Наконец, на основе входных данных, которые вы задаете в constructor of Table , вы получите запрос и результат.

Класс таблицы:

 public class TableRow {
    private String attibute1;
    private String attibute2;
    private int id;
    // getter and setters

    public final String selectQuery = " SELECT ID, ATTIBUTE1, ATTIBUTE2 FROM TABLEROW ";

    public CECardLogRow(int id, String attibute1, String attibute2) {
        this.id = id;
        this.attibute1 = attibute1;
        this.attibute2 = attibute2;
    }

    public String getSelectQuery () {
        StringBuilder sql = new StringBuilder();
        boolean whereClauseAdded = false;       
        sql = sql.append(selectQuery);
        if (id > -1) {
            sql.append(" WHERE ID = ? ");
            whereClauseCt  ;
        }
        if (attibute1 != null amp;amp; attibute1.trim() != "") {
            sql.append(whereClauseAdded ? " AND " : " WHERE ");
            sql.append(" ATTIBUTE1 = ? ");
        }
        if (attibute2 != null amp;amp; attibute2.trim() != "") {
            sql.append(whereClauseAdded ? " AND " : " WHERE ");
            sql.append(" ATTIBUTE2 = ? ");
        }
        return sql.toString();
    }

    public void populatePreparedSt (PreparedStatement ps) {
        int i = 1;
        if (id > -1) {
            ps.setInt(i  , id);         
        }
        if (attibute1 != null amp;amp; attibute1.trim() != "") {
            ps.setString(i  , attibute1);
        }
        if (attibute2 != null amp;amp; attibute2.trim() != "") {
            ps.setString(i  , attibute2);
        }           
    }
}
  

Вызывающий метод:

 public List<TableRow> getData (int id, String attibute1, String attibute2) {
    List<TableRow> rows = new ArrayList<TableRow>();
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        TableRow row = new TableRow(id, attibute1, attibute2);          
        String sql = row.getSelectQuery();
        con = global.getConnection(); // get connection
                    ps = con.prepareStatement(sql);
        row.populatePreparedSt(ps);
        rs = ps.executeQuery(); 
        while (rs.next()) {
            TableRow row = new TableRow();
            // get data
            row.setId(rs.getInt("ID"));// and so on             
            rows.add(tableRow);
        }
    } catch (SQLException sqe) {
        throw sqe;
    } finally() {
        // closeConnection
    }
    return rows;
}
  

Комментарии:

1. Я думаю, люди, вы меня неправильно поняли. Я создал класс сущности как EntityBo . В этом классе будут все поля таблиц . Теперь у меня будет еще один вспомогательный класс, который будет заполнять поля в классе EntityBo . Теперь я также заполнил этот класс сущностей. После этого в вспомогательном классе нам нужен метод, который будет динамически создавать sql-запрос. Итак, в основном я застрял здесь, чтобы создать метод, который будет динамически создавать запрос на основе заполненных входных атрибутов.

2. Запрос будет примерно таким: — ВЫБЕРИТЕ * из CCMS.USER_ACT_AUDIT, где CLIENT_ID = ‘GUI’ И USER_ID = ‘pagi@yahoo.co.in ’ И ACTION = ‘Поисковые группы’ с ur . Атрибуты, упомянутые в запросе здесь, будут заполнены в классе entity, и на основе этих атрибутов запрос будет выполнен динамически . Итак, мне просто нужен метод для динамического построения запроса.

3. Разве вы не видите, что запрос строится динамически на основе входных данных?

4. Может ли кто-нибудь объяснить полезность метода populatePreparedSt()

5. Обновленный ответ с объяснением.