2010-02-15 6 views
0
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' 

Fondamentalement, j'ai le ff. domaines: Compte, AdventPosition, FidelityPosition. Je n'ai pas encore défini la relation. Je me demande simplement s'il existe un moyen de reproduire la logique ci-dessus en utilisant les critères ou HQL. Pardonnez-moi, je suis encore nouveau à Grails.Besoin d'aide pour transformer cette instruction SQL en GORM

Merci pour votre intérêt.

Répondre

0

Ce serait quelque chose proche de ceci:

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]) 

Les résultats seront un ArrayList d'objets [], de sorte que vous pouvez itérer avec quelque chose comme

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] 
} 

J'ai remplacé le disque numéro de compte codé avec un paramètre nommé; vous pouvez utiliser régulièrement? comme dans SQL si vous préférez et exécutez 'def results = Account.executeQuery (hql, [accountNumber])', et bien sûr si vous l'avez intentionnellement codé en dur, puis le restaurer et ne pas passer dans le 2ème paramètre, juste run « def résultats = Account.executeQuery (hql) »

+0

la réponse parfaite! Merci beaucoup! – firnnauriel

0

partage juste la solution que je suis venu (en attendant une réponse: P) mais notez que la réponse précédente est bien meilleure et plus rapide:

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) 
} 
Questions connexes