我遇到了这段代码的问题:
string sql = "select distinct ruoli.c_tip_usr"
+ " from vneczx_ute_app_trn ruoli"
+ " join vnecyd_ent_prf ind"
+ " on ruoli.c_ent = ind.c_ent"
+ " where ruoli.c_app = :appCode"
+ " and ruoli.c_ute_mat = :matricola"
+ " and ind.t_des_ent = :indirizzo";
var ruoli = session.CreateSQLQuery(sql)
.SetString("appCode", Config.Configurator.Istance.ApplicationCode)
.SetString("matricola", user.Matricola)
.SetString("indirizzo", indirizzoCasella)
.List<string>();
此代码正确执行,记录的查询正确,并且传递的参数正确评估......但它根本不返回任何结果。从调试控制台复制查询并直接在 Oracle 客户端应用程序(SQL Developer)中执行,它得到 2 个结果(我期望的结果是正确的)。
我发现问题出在最后一个参数indirizzo
中,并且应该取决于它包含一个特殊字符@
(indirizzo
是一个电子邮件地址)的事实。
所以我最终使用了这个解决方案:
string sql = "select distinct ruoli.c_tip_usr"
+ " from vneczx_ute_app_trn ruoli"
+ " join vnecyd_ent_prf ind"
+ " on ruoli.c_ent = ind.c_ent"
+ " where ruoli.c_app = :appCode"
+ " and ruoli.c_ute_mat = :matricola"
+ " and ind.t_des_ent = '" + indirizzoCasella + "'";
var ruoli = session.CreateSQLQuery(sql)
.SetString("appCode", Config.Configurator.Istance.ApplicationCode)
.SetString("matricola", user.Matricola)
.List<string>();
但它让我兴奋!查询中的参数是否应该专门处理这种情况,从而使用特殊字符处理自己的情况等等?为什么这里的字符串连接比参数查询效果更好?有没有办法强制 NHibernate 引擎转义一些特殊字符?
更新:
我发现了如何解决这个特定问题:trim
在提出问题的字段上使用命令,问题就消失了。所以我的 sql 字符串的最后一行现在是:
+ " and trim(ind.t_des_ent) = :indirizzo";
我不明白为什么它解决了这个问题。不是字段,也不是变量包含空字符,并且在 SQL Developer 上复制查询以两种方式工作。所以我们有一些运气解决了这个问题,但我们不知道为什么现在它可以工作了?有什么想法吗?