2012-06-21 6 views
1

HQL запросов к базе данных PostgreSQL:HQL 42P01: отсутствует С-п запись для таблицы

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 

... теперь, WTF? Алиасы предложения select не существуют в предложении from, что объясняет ошибку, но, конечно, не является причиной ошибки.

Как я могу обойти это?

+0

Но какова полная ошибка и трассировка стека? –

ответ

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, это кажется очень важным.