2009-09-21 51 views
0

我有PostgeSQL和NHibernate的問題。我已經嘗試過HQL和Criteria,並且選擇什麼都不返回。我使用log4net來獲取生成的查詢,用值替換參數並查詢返回結果,爲什麼? Postgre或NHibernate有特殊配置嗎?我甚至試圖降低(低(列)像低(:帕拉姆)),沒有結果。PostgreSQL與NHibernate的問題與LIKE和參數

HQL : return sess.CreateQuery("from VersFile e where e.ConfigId = :confId and lower(e.FolderPath) like lower(:path) and e.Type = :type and e.Statuss = :statuss and e.Tester != '' order by e.Sequence asc").SetString("path",path).SetInt32("type", fileType).SetInt32("confId", configId).SetInt32("statuss", recordStatuss).List<VersFile>(); 

FOLDERPATH是字符改變列

或標準

return sess.CreateCriteria(typeof(VersFile)).Add(Expression.Eq("Type", fileType)).Add(Expression.Eq("Statuss", recordStatuss)).Add(Expression.Eq("ConfigId", configId)).Add(Expression.Like("FolderPath", path, MatchMode.Start)).Add(Expression.Not(Expression.Eq("Tester", ""))).Add(Expression.Not(Expression.Eq("Statuss", (int)RecordStatuss.Merged))).AddOrder(Order.Asc("Sequence")).List<VersFile>(); 

生成的查詢看上去像

select .... from versfile versfile0_ where (versfile0_.statuss!=99) and versfile0_.confId=:p0 and (lower(versfile0_.fpath) like lower(:p1)) order by versfile0_.sequen asc;:p0 = 1, :p1 = '\%MainVss\%WinGui\%' 

我已經移除查詢字符串參數無用

+1

向我們展示一些代碼... – 2009-09-21 08:19:07

+0

考慮編輯您的文章並將其格式化爲代碼,除非您希望每個人都是密碼分析師。 – 2009-09-21 08:39:58

回答

1

實際上,'\%MainVss\%WinGui\%'在現代Postgreses中並不十分有效。它可以是E'\%MainVss\%WinGui\%'或'%MainVss%WinGui%'。這相當於'%MainVss%WinGui%',這不一定是你想要的。

+0

其實它必須是\ MainVss \ WinGui \%,但是當我使用pgAdmin進行選擇時,返回結果的唯一正確值是\%MainVss \%WinGui \%,爲什麼?我不知道。 – PavelsM 2009-09-21 09:43:27

+0

你在實際查詢中想要的是'E'\\ MainVss \\ WinGui \\%''。你可能會忽略'E'前綴,但這應該會導致警告。您在pgadmin中使用它的方式基本上意味着'* * MainVss * * WinGui * *'。反斜槓與此相匹配,但你真正想做的只是加倍你的反斜槓。另外,您可能需要在源代碼中添加轉義,這是我不瞭解的。 – 2009-09-21 09:51:23

+0

是的,我正在尋找E'\\ MainVss \\ WinGui \\%',但我使用NHibernate,所有的數據都被NHibernate插入到表中。我沒有測試數據庫的地方,我使用SQLite的問題。 – PavelsM 2009-09-21 10:09:47