Лучший способ написать запрос на соединение в ormlite - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть две таблицы CustomerBalance и Customer, которые связаны с полем CustomerRefId.Мне нужны записи CustomerBalance, скажем, больше 100 для баланса полей этих таблиц.Я также хочу включить в мои результаты имя конкретного клиента, который соответствует этим критериям.Я создал следующий метод, который работает!

public List<CustomerBalance> getCustomerBalanceFilter(String filterVal) {
    try {
        PreparedQuery<CustomerBalance> preparedQuery = mDbHelper.getCustomerBalanceDao().queryBuilder()
            .where().gt(CustomerBalance.DB_COL_CUSTOMER_BALANCE, filterVal)
            .prepare();
        List<CustomerBalance> result = mDbHelper.getCustomerBalanceDao().query(preparedQuery); 

        for(CustomerBalance alert : result) {
            PreparedQuery<Customer> getCustQuery = mDbHelper.getCustomerDao().queryBuilder()
                .where().eq(Customer.DB_COL_CUSTOMER_REF_ID, alert.getCustomerID())
                .prepare();
            List<Customer> customer = mDbHelper.getCustomerDao().query(getCustQuery);

            alert.setCustomer(customer.size() == 1 ? customer.get(0) : null);
        }

        return result;

    } catch(Exception ex) {
        return null;
    }
} 

Этот метод работает, это лучший способ написать такой запрос?или есть более подходящий подход?

1 Ответ

2 голосов
/ 05 сентября 2011

Одним из улучшений в вашем запросе является использование ORMLite SelectArg для передачи идентификатора клиента вместо нового запроса каждый раз.Что-то вроде:

...
List<CustomerBalance> result = mDbHelper.getCustomerBalanceDao()
    .query(preparedQuery); 

SelectArg custIdArg = new SelectArg();
PreparedQuery<Customer> getCustQuery = mDbHelper.getCustomerDao().queryBuilder()
    .where().eq(Customer.DB_COL_CUSTOMER_REF_ID, custIdArg)
    .prepare();
for (CustomerBalance alert : result) {
    custIdArg.setValue(alert.getCustomerID());
    List<Customer> customer = mDbHelper.getCustomerDao().query(getCustQuery);
    alert.setCustomer(customer.size() == 1 ? customer.get(0) : null);
}

Вот документы для SelectArg:

http://ormlite.com/docs/select-arg

К вашему сведению, также есть UpdateBuilder, но я не вижу простого способа превратить указанный выше код в один оператор UPDATE.

...