针对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
子句别名,这解释了错误,但当然不存在错误的原因。
我该如何解决这个问题?
答案 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中,它似乎非常重要。