Нужна помощь в преобразовании этого оператора SQL в GORM - PullRequest
0 голосов
/ 15 февраля 2010
    select
        b.security_type,
        b.symbol,
        b.security_description,
        b.trade_date_qty as 'axys_qty',
        c.trade_date_qty as 'fidelity_qty',
        c.trade_date_qty - b.trade_date_qty as 'qty_diff',
        b.cost_basis as 'axys_cost',
        c.cost_basis as 'fidelity_cost',
        c.cost_basis - b.cost_basis as 'cost_diff'
    from
        account a
        inner join advent_position b on a.fixed_account_number = b.account_number
        inner join fidelity_position c on a.fixed_account_number = c.account_number and b.symbol = c.symbol
    where
        b.account_number = '636296651'

По сути, у меня есть фф. домены: Аккаунт, AdventPosition, FidelityPosition. Я еще не установил отношения. Мне просто интересно, есть ли способ повторить логику выше, используя Criteria или HQL. Простите, я все еще новичок в Grails.

Спасибо за любые предложения по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2010

просто делюсь решением, которое я нашел (ожидая ответа: P), но учтите, что предыдущий ответ намного лучше и быстрее:

def acc = Account.findByFixedAccountNumber('636296651')
List advPos = AdventPosition.findAllByAccountNumber('636296651')
List fidPos = advPos.collect {
    FidelityPosition.findAllByAccountNumberAndSymbol('636296651', it.symbol)
}

def item = [:]
def res = []

def limit = advPos.size() - 1
for(i in 0..limit){
    item.security_type = advPos[i].securityType
    item.symbol = advPos[i].symbol
    item.security_description = advPos[i].securityDescription
    item.axys_qty = advPos[i].tradeDateQty
    item.fidelity_qty = fidPos[i].tradeDateQty
    item.qty_diff = item.fidelity_qty - item.axys_qty
    item.axys_cost = advPos[i].costBasis
    item.fidelity_cost = fidPos[i].costBasis
    item.cost_diff = item.fidelity_cost - item.axys_cost 
    res.add(item)
}
0 голосов
/ 15 февраля 2010

Было бы что-то похожее на это:

String hql = '''
select
   b.securityType,
   b.symbol,
   b.securityDescription,
   b.tradeDateQty,
   c.tradeDateQty,
   c.tradeDateQty - b.tradeDateQty,
   b.costBasis,
   c.costBasis,
   c.costBasis - b.costBasis
from
   Account a, AdventPosition b, FidelityPosition c
where
   a.fixedAccountNumber = b.accountNumber
   and a.fixedAccountNumber = c.accountNumber
   and b.symbol = c.symbol
   and b.accountNumber = :accountNumber
'''

def accountNumber = '636296651'
def results = Account.executeQuery(hql, [accountNumber: accountNumber])

Результатом будет ArrayList объекта [], так что вы можете повторить его с чем-то вроде

for (row in results) {
   def securityType = row[0]
   def symbol = row[1]
   def securityDescription = row[2]
   def axys_qty = row[3]
   def fidelity_qty = row[4]
   def qty_diff = row[5]
   def axys_cost = row[6]
   def fidelity_cost = row[7]
   def cost_diff = row[8]
}

Я заменил жестко запрограммированный номер счета на именованный параметр; Вы можете использовать обычный? как в SQL, если вы предпочитаете и запускаете «def results = Account.executeQuery (hql, [accountNumber])», и, конечно, если вы намеревались использовать его жестко, восстановите его и не передавайте второй параметр, run 'def results = Account.executeQuery (hql)'

...