2

PostgreSQL データベースに対する HQL クエリ:

var checkLines = _Session.CreateQuery(
    @"select lines from FinancialStatement statement
        inner join fetch statement.FinancialStatementLines lines
    where statement.FinancialStatementId = :statementId
        and lines.TransactionType = :transactionType
        and length(lines.CheckNumber) > 0")
    .SetParameter("statementId", statement.FinancialStatementId)
    .SetParameter("transactionType", TransactionTypes.Debit)
    .List<FinancialStatementLine>();

クエリは問題ないように見えますが、私は HQL の初心者です。誰かが私が間違っていることを教えてもらえますか? 問題は HQL にあると思います。他の場所を探す必要があると思われる場合はお知らせください。

プロットが濃くなる

上記の HQL によって作成されたクエリを調べると、次のようになっていることがわかりました。

select 
    financials1_.LineId as LineId14_, 
    financials1_.FinancialStatementId as Financia2_14_, 
    financials1_.APPaymentID as APPaymen3_14_, 
    financials1_.EffectiveDate as Effectiv4_14_, 
    financials1_.Amount as Amount14_, 
    financials1_.TransactionType as Transact6_14_, 
    financials1_.CheckNumber as CheckNum7_14_, 
    financials1_.Description as Descript8_14_, 
    financials1_.VendorDescription as VendorDe9_14_, 
    financials1_.FinancialStatementId as Financia2_, 
    financials1_.LineId as LineId 
from 
    FinancialStatements financials0_ 
where 
    financials0_.FinancialStatementId=:p0 
    and financials1_.TransactionType=:p1 
    and length(financials1_.CheckNumber)>0

...今、何?句のselectエイリアスがfrom句に存在しないため、エラーが説明されますが、もちろん、エラーが存在する理由はわかりません。

どうすればこれを回避できますか?

4

1 に答える 1

0

対処法は次のとおりです。明らかに、HQL を使用する場合、適切なクエリを生成するには、取得しようとしているオブジェクト タイプをクエリの最初の部分として指定する必要があります。次に例を示します。

var paymentLines = _Session.CreateQuery(
    @"select lines from FinancialStatementLine lines
        inner join fetch lines.Statement statement
    where statement.FinancialStatementId = :statementId
        and lines.TransactionType = :transactionType")
    .SetParameter("statementId", statement.FinancialStatementId)
    .SetParameter("transactionType", TransactionTypes.Debit)
    .List<FinancialStatementLine>();

これは機能しますが、他のクエリは機能しません。SQL では、結合の順序はそれほど重要ではありません。HQL では、かなり重要なようです。

于 2012-08-29T11:16:33.543 に答える