HQL 42P01:缺少表的FROM子句条目

时间:2012-06-21 02:44:42

标签: hibernate nhibernate postgresql hql npgsql

针对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

......现在,WTF? select子句中不存在from子句别名,这解释了错误,但当然不存在错误的原因。

我该如何解决这个问题?

1 个答案:

答案 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中,它似乎非常重要。