2009-10-12 6 views
1

Je suis confronté à un problème dans le champ de formule de propriété Hibernate - Je ne parviens pas à combiner les deux colonnes de la table.Calculer des valeurs de table enfant dans le champ de formule de Hibernate

shift_id colonne appartient à la table mère de job_card et duration colonne appartient à la table des enfants de job_card_idle_time. Mais il considère les deux colonnes comme appartenant à la table parent de job_card.

<property 
    name="utilization" 
    formula="(count(shift_id)*340)-sum(duration)/(count(shift_id)*340)" 
    generated="never" 
    insert="false" 
    update="false" 
    type="float"> 
</property> 

Avec la requête résultante:

select (count(this_.shift_id)*340)-sum(**this_.duration**) /(count(this_.shift_id)*340) as y0_, 
    this_.JOB_CARD_DATE as y1_ 
    from job_card this_ 
    left outer join job_card_idle_time ir1_ on this_.JOB_CARD_ID=ir1_.JOB_CARD_ID 
    where this_.JOB_CARD_DATE between ? and ? 
    group by this_.JOB_CARD_DATE 
    order by this_.JOB_CARD_DATE desc 

Je veux que cela.

select (count(this_.shift_id)*340)-sum(**ir1_.duration**) 
    /(count(this_.shift_id)*340) as y0_, 
    this_.JOB_CARD_DATE as y1_ 
    from job_card this_ 
    left outer join job_card_idle_time ir1_ on this_.JOB_CARD_ID=ir1_.JOB_CARD_ID 
    where this_.JOB_CARD_DATE between ? and ? 
    group by this_.JOB_CARD_DATE 
    order by this_.JOB_CARD_DATE desc 

Comment puis-je y parvenir?

+0

Je suggère que vous votiez pour les réponses que vous trouvez utiles, en utilisant la flèche vers le haut à côté de la réponse. Et finalement, quand une réponse est correcte pour vous, vous pouvez l'accepter en cliquant sur le petit signe. – KLE

Répondre

3

Ce type de requête est mieux mappé en tant que, bien, requête plutôt que propriété dérivée.

Formula ne peut contenir l'expression SQL basée sur des colonnes de table en cours . La seule façon d'utiliser des colonnes d'autres tables est d'écrire votre formule sous-sélection:

(SELECT count(card.shift_id) * 340 - sum(idleTime.duration)/(count(card.shift_id) * 340) 
    FROM job_card card 
    LEFT OUTER JOIN job_card_idle_time idleTime on card.job_card_id = idleTime.job_card_id 
    WHERE card.shift_id = shift_id) 

Lorsque vous faites référence à la colonne sans un alias, il sera préfixé avec un alias de votre table principale entité lors de l'exécution de la requête. Notez, cependant, que ce qui précède ne fera pas ce que vous voulez, car vous ne pouvez pas regrouper dans la sous-sélection en fonction de critères externes. En outre, en fonction de votre base de données, la jointure externe à l'intérieur de la sous-sélection peut ne pas être prise en charge.

+0

+1 Merci pour les précisions, j'ai supprimé ma réponse qui s'est avérée inutile. – KLE

+0

"Lorsque vous faites référence à une colonne sans alias, elle sera préfixée par un alias de votre table d'entité principale lors de l'exécution de la requête." Est-ce toujours le cas en hibernation 4.3.11? J'ai une formule simple où l'entité parent _id n'est pas aliasée: '@Formula (" (SELECT count (child._id) FROM Enfant enfant WHERE child._parent__id = _id) ")' Ce dernier _id doit référencer l'entité contenant (Parent), mais il n'est jamais aliasé dans le sql généré. – Casey

Questions connexes