2013-04-26 2 views
0

원시 쿼리를 만들 때 QueryBuider를 사용하고 있지만 수동으로 원시 쿼리에 매개 변수를 채워야합니다.QueryBuider는 Dao.queryRaw에 대한 매개 변수를 가져옵니다.

'from'및 'to'속성은 두 번 채 웁니다. QueryBuider의 'Where'섹션에 하나, queryRaw 메소드에 하나가 매개 변수로 사용됩니다. 메서드 StatementBuilder.prepareStatementString()은 "?"가 포함 된 쿼리 문자열을 반환합니다. 대체를 위해서.

이러한 매개 변수를 QueryBuider 인스턴스에서 직접 가져올 수있는 방법이 있습니까?

예를 들어, ormlite에서 새로운 메소드를 상상해보십시오 - StatementBuilder.getPreparedStatementParameters();

QueryBuilder<AccountableItemEntity, Long> accountableItemQb = accountableItemDao.queryBuilder(); 

QueryBuilder<AccountingEntryEntity, Long> accountingEntryQb = accountingEntryDao.queryBuilder(); 
accountingEntryQb.where().eq(
    AccountingEntryEntity.ACCOUNTING_ENTRY_STATE_FIELD_NAME, 
    AccountingEntryStateEnum.CREATED); 
accountingEntryQb.join(accountableItemQb); 

QueryBuilder<AccountingTransactionEntity, Long> accountingTransactionQb = 
    accountingTransactionDao.queryBuilder(); 
accountingTransactionQb.selectRaw("ACCOUNTINGENTRYENTITY.TITLE, " + 
     "ACCOUNTINGENTRYENTITY.ACCOUNTABLE_ITEM_ID, " + 
     "SUM(ACCOUNTINGENTRYENTITY.COUNT), " + 
     "SUM(ACCOUNTINGENTRYENTITY.COUNT * CONVERT(ACCOUNTINGENTRYENTITY.PRICEAMOUNT,DECIMAL(20, 2)))"); 
accountingTransactionQb.join(accountingEntryQb); 
accountingTransactionQb.where().eq(
     AccountingTransactionEntity.ACCOUNTING_TRANSACTION_STATE_FIELD_NAME, 
     AccountingTransactionStateEnum.PRINTED) 
    .and().between(AccountingTransactionEntity.CREATE_TIME_FIELD_NAME, from, to); 
accountingTransactionQb.groupByRaw(
    "ACCOUNTINGENTRYENTITY.ACCOUNTABLE_ITEM_ID, ACCOUNTINGENTRYENTITY.TITLE"); 

String query = accountingTransactionQb.prepareStatementString(); 

accountingTransactionQb.prepare().getStatement(); 

Timestamp fromTimestamp = new Timestamp(from.getTime()); 
Timestamp toTimestamp = new Timestamp(to.getTime()); 

//TODO: get parameters from accountingTransactionQb 
GenericRawResults<Object[]> genericRawResults = 
    accountingEntryDao.queryRaw(query, new DataType[] { DataType.STRING, 
     DataType.LONG, DataType.LONG, DataType.BIG_DECIMAL }, 
     fromTimestamp.toString(), toTimestamp.toString()); 

답변

0

QueryBuider 인스턴스에서 직접 이러한 매개 변수를 얻을 수있는 방법이 있습니까?

예, 방법이 있습니다. QueryBuilder의 하위 클래스가 필요하고 appendStatementString(...) 메서드를 사용할 수 있습니다. 인수 목록을 가져 오는 데 사용할 수있는 argList을 제공합니다.

protected void appendStatementString(StringBuilder sb, 
     List<ArgumentHolder> argList) throws SQLException { 
    appendStatementStart(sb, argList); 
    appendWhereStatement(sb, argList, true); 
    appendStatementEnd(sb, argList); 
} 

예를 들어, 새로운 ormlite에있어서 상상 - StatementBuilder.getPreparedStatementParameters을();

좋은 아이디어. 나는 Github repo에 following changes을 만들었습니다.

public StatementInfo prepareStatementInfo() throws SQLException { 
    List<ArgumentHolder> argList = new ArrayList<ArgumentHolder>(); 
    String statement = buildStatementString(argList); 
    return new StatementInfo(statement, argList); 
} 
... 
public static class StatementInfo { 
    private final String statement; 
    private final List<ArgumentHolder> argList; 
    ... 

이 기능은 버전 4.46입니다. 해당 릴리스를 기다리지 않으려면 현재 트렁크에서 릴리스를 빌드 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. – user1520270

관련 문제