NHibernate - 如何使用参数值记录命名参数化查询?

2024-04-22

我有一个参数化的命名查询,如下所示:

Query moveOutQuery = session.createSQLQuery(moveOutQueryStr.toString())
                .addEntity(MyClass.class)
                .setParameter("assignmentStatus", Constants.CHECKED_OUT)

我想查看填充了参数的实际 SQL 查询。但是在调试时我只得到以下查询:

Select * from my_assignment WHERE assignment_status in ( :assignmentStatus )

为什么不是assignmentStatus被取代其实际价值?


为什么不将赋值状态替换为它的实际值?

这是因为 NHibernate 使用查询参数来输入值。这是有效的many案例,也有助于抵御 SQL 注入攻击。参数单独发送。如果按如下所述记录 SQL,您可以在底部找到它们。


您可以将每个 SQL 记录到文件中,如下所述。

这是通过以下方式实现的log4net.dll https://www.nuget.org/packages/log4net/;你需要添加参考。

添加命名空间如下:

using log4net;
using log4net.Appender;
using log4net.Core;
using log4net.Layout;
using log4net.Repository.Hierarchy;

配置log4net在NHibernate中如下:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();

FileAppender fileAppender = new FileAppender();
fileAppender.Name = "NHFileAppender";
fileAppender.File = logFilePath;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.Layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}:%m%n%n");
fileAppender.ActivateOptions();

Logger logger = hierarchy.GetLogger("NHibernate.SQL") as Logger;
logger.Additivity = false;
logger.Level = Level.Debug;
logger.AddAppender(fileAppender);

hierarchy.Configured = true;

您还需要设置ShowSql而配置如下:

configuration.SetProperty(NHibernate.Cfg.Environment.ShowSql, "true");
configuration.SetProperty(NHibernate.Cfg.Environment.FormatSql, "true");

您需要在应用程序启动时调用此代码一次。输出日志还包括参数值。

以下是代码:

session.CreateSQLQuery("SELECT * FROM MyEntity WHERE MyProperty = :MyProperty")
            .AddEntity(typeof(MyEntity))
            .SetParameter("MyProperty", "filterValue")
            .UniqueResult<MyEntity>();

以下是记录的查询:

2020-01-09 14:25:39:
    SELECT
        * 
    FROM
        MyEntity 
    WHERE
        MyProperty = @p0;
    @p0 = 'filterValue' [Type: String (4000:0:0)]

可以看到,参数值filterValue列在底部。

这适用于所有查询 API,例如IQueryOver, IQuery, ISQLQuery etc.

这会记录成功和失败的语句。你可以玩FileAppender https://logging.apache.org/log4net/release/sdk/html/T_log4net_Appender_FileAppender.htm and Logger https://logging.apache.org/log4net/release/sdk/html/T_log4net_Repository_Hierarchy_Logger.htm类以满足您的额外要求。

另请参阅PatternLayout http://logging.apache.org/log4net/release/sdk/html/M_log4net_Layout_PatternLayout__ctor_1.htm from 文档 http://logging.apache.org/log4net/release/sdk/?topic=html/T_log4net_Layout_PatternLayout.htm。还可以找到更多详细信息here https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Layout.PatternLayout.html, here https://www.codejava.net/coding/common-conversion-patterns-for-log4js-patternlayout and here http://spoiledtechie.com/post/2015/11/19/Conversion-Patterns-for-Log4Net.aspx. This https://stackoverflow.com/q/1102026/5779732Q/A 也讨论了同样的问题。

以下问答也可能有帮助:

  • 从 nHibernate 获取执行的 SQL https://stackoverflow.com/q/1264132/5779732
  • 使用 log4net 写入不同的记录器 https://stackoverflow.com/q/17106559/5779732
  • 如何使用 NHibernate 将 SQL 调用记录到 Visual Studio 的控制台? https://stackoverflow.com/q/474659/5779732

如您所见,这会在查询底部记录参数值。如果您希望将那些记录嵌入到查询中,请参阅this https://www.codeproject.com/Articles/249154/Logging-NHibernate-Queries-with-Parameters文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate - 如何使用参数值记录命名参数化查询? 的相关文章

  • Nhibernate CreateSQLQuery 存储过程结果到非映射类

    在我的应用程序中 我想从存储过程中获取数据 其中表未映射到应用程序中 在此存储过程中 我向列名添加了别名 这些别名响应我的类中的属性 HQL return Session CreateSQLQuery exec PER PrikklokSa
  • NHibernate 中的 DateTime 精度以及 NHibernate SchemeExport 中对 DateTime2 的支持

    然后 我使用 Fluent NHibernate 及其自动映射功能来映射以下简化的 POCO 类 public class Foo public virtual int Id get set public virtual datetime
  • NHibernate elt 字段

    有谁知道为什么 NHibernate 为多对多映射生成一个名为 elt 的 int 类型字段 我想知道为什么我需要它 谢谢 elt 字段是多对多映射中元素的外键 在连接表中 您应该看到两个外键列 id 对于父级 和 elt 对于元素 如果您
  • 简单参数化查询出错 - Java/ SQL

    继我之前的一个问题之后方法设计 https stackoverflow com questions 5490214 method design clarity or multifunction建议我将 SQL 查询实现为参数化查询 而不是简
  • NHibernate二级缓存性能问题

    我正在使用 NHibernate 使用每个请求会话模式开发一个 MVC 应用程序 大多数时候用户只是读取数据 因此我尝试通过以下方式使用 NHibernate 的二级缓存 我设置了 SysCache 并使所有持久实体可缓存 缓存使用 non
  • select N + 1 比 eager join 更好吗?

    我正在使用 nhibernate profiler 并看到它在一些地方给我一个 Select n 1 警告 明显的解决方法是进行一些预先的热切连接 但这让我思考 在某些情况下 与可能会加载大量您从未实际使用的数据的连接相比 使用 Selec
  • Fluent NHibernate:ManyToMany 自引用映射

    我需要帮助为这种情况创建正确的流畅 nh 映射 类别可以是一个或多个类别的子类别 因此 导致该实体 public class Category Entity IAggregateRoot EntitySignature public vir
  • sp_executesql 导致我的查询非常慢

    我在数据库表上运行 sp executesql 时遇到一些问题 在本例中 我使用 ORM NHibernate 生成一个查询一个表的 SQL 查询 该表大约有 700 万条记录 并且索引很高 当我运行 ORM 在没有 sp executes
  • NHibernate 中的延迟加载

    如果客户有很多订单 如何使用 NHibernate 延迟加载订单列表 是不是需要设置映射文件 任何帮助或例子都会很棒 克里斯的建议是我如何做到这一点 但是如果您想在运行时执行此操作 您可以根据您的标准将 Fetchmode 设置为惰性 如下
  • NHibernate连接字符串:如何指定端口号和服务器\实例?

    我正在用 NHibernate 2 1 替换旧的 DAL 我的 NHibernate 配置适用于我的本地开发机器 但不适用于 UAT UAT 数据库是在非默认端口上设置的集群 我正在使用类似于下面的标准 NHibernate confie
  • 流畅的 NHibernate 将 IList 作为值映射到单列

    我有这门课 public class MyEntity public virtual int Id get set public virtual IList
  • 使用 NHibernate 在延迟加载场景中使用 Castle.DynamicProxy 实现 IDataErrorInfo

    我已经使用 Castle DynamicProxy IIterceptor 实现了 IDataErrorInfo 接口 我还实现了一个 NHibernate 拦截器 它使用该拦截器实例化我的实体 问题在于延迟加载的实体 这些是使用 nhib
  • 如何使用代码“约定”映射来忽略属性映射

    有什么方法可以避免使用 NHibernate 3 2 使用代码约定映射来映射属性吗 默认情况下 所有属性都会被映射 2 作为复制粘贴 IsPersistent 属性默认实现的替代方案 它可以通过反射重用 var mapper new Con
  • ORM 是用于迁移数据的正确工具吗?

    背景 我们正在升级旧版导入工具 它的作用是将数据从连接到 SQL Server 的一个数据库移动到同一服务器上的第二个数据库 并使用不同的模式沿途执行转换和映射 这是一个帮助解释正在发生的事情的示例 假设源数据库有一张表名为Client I
  • 抽象 NHibernate 标准是否有价值?

    我对 NHibernate 相当陌生 我见过的大多数示例都在基础上添加了一些抽象层Criterion or DetachedCriterion类 在简单的情况下 它是某种Query类可能看起来像这样 public class Query
  • NHibernate 获取没有主键的子项

    我试图通过映射将对象集合放入父对象中 我有一个主键是 guid Id 的父对象 ScoreCard 和一个主键是 guid Id 的子 Score 对象 我想根据两个对象都有的两个字段为父对象选择子对象 但我无法让它工作 这是映射
  • 使用二级缓存时,nhibernate 查询缓存和实体缓存有什么区别?

    我正在尝试设置 nhibernate 二级缓存我在这篇文章中看到 http www gitshah com 2012 03 nhibernate and caching part 2 html我想了解查询缓存和实体缓存之间的区别 它说你需要
  • 如何让 NHibernate 缓存获取的子集合?

    我有一个相当简单的条件查询来获取子集合 如下所示 var order Session CreateCriteria
  • 软删除 Nibernate

    我想对我的数据库表进行软删除 我应用了以下语句 如此处所述http nhibernate info blog 2008 09 06 soft deletes html http nhibernate info blog 2008 09 06
  • 如何在 NHibernate 中自动生成 ID

    如何让 NHibernate 自动生成表的唯一 ID ID 可以是任意的long值 只要每个值仅使用一次 我当前的映射如下所示

随机推荐

  • 如何从 PHP 字符串中获取 64 位整数哈希值?

    我需要 64 位字符串整数哈希值来实现哈希映射之类的功能 在我看来 没有可以返回 64 位整数的原生 PHP 哈希功能 我认为可以获取 sha1 哈希值的第一部分并将其转换为整数 然而 这不会带来最好的性能 而且转换似乎很棘手 当然 如果不
  • VBA 6.0 和 VBA 7.0 有什么区别?

    我注意到 Office 2010 附带了 Visual Basic for Applications 7 0 但是我似乎找不到太多关于所做更改的文档 有没有人有更改摘要或描述差异的任何资源 VBA6 和 VBA7 之间并没有太多变化 引入
  • 使用 JSoup 时选择具有多个类的元素

    我正在解析网站上的一些表格 特别是我试图按类名提取以下单元格 Elements e d select span class bld lrg red for Element element e System out println eleme
  • 如何捕捉 contentEditable 粘贴事件?

    我有一个很棒的可编辑文本区域wysihat http github com josh wysihat 和内容可编辑 我确实需要一种方法来拦截粘贴事件以阻止它们 或者在允许插入之前处理它们的 DOM 人们可以将整个网页粘贴到可编辑区域 这有点
  • Dependency Walker 未显示所有依赖的 Dll

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • 复制上个月的值并插入到新行中

    这是我当前表的示例 1 表名称 TotalSales Name Year Month Sales Alfred 2011 1 100 我想要做的是创建一个像这样的表 添加一个新行 上个月的销售额 2 表名称 TotalSales Name
  • PHPstorm PHPunit 代码共同覆盖

    当我在 PHPstorm 中运行测试套件时 所有代码覆盖率都为 0 我知道这不是真的 当我从命令行运行 PHPunit 时 记录的 HTML 输出文档显示我实际上确实有覆盖率并列出所有详细信息 在 PHPstorm 中 我将 PHP 解释器
  • 从 xml 节点获取行号 - java

    我已经解析了一个 XML 文件并获得了一个我感兴趣的节点 现在如何在源 XML 文件中找到该节点出现的行号 编辑 目前我正在使用 SAXParser 来解析我的 XML 不过 我会对使用任何解析器的解决方案感到满意 除了节点之外 我还有节点
  • Solr距离过滤

    我正在尝试使用 Solr 进行距离范围搜索 我知道在5公里范围内进行搜索过滤很容易 q fq geofilt pt 45 15 93 85 sfield store d 5 我所追求的是如果我正在寻找一系列的说法 如何做同样的事情5至10公
  • 如何在 Django 管理中显示 ManyToMany 关系的 raw_id 值?

    我有一个应用程序在ForeignKeyField 和ManyToManyField 上使用raw id 管理员在编辑框右侧显示外键的值 不幸的是 它不适用于ManyToMany 我检查了代码 我认为这是正常行为 但是我想知道是否有人有一个简
  • 如何在不同的扬声器上播放声音?

    我的设备有 2 个外部扬声器 我如何分别测试它们 一种功能仅在左侧播放声音 一种功能仅在右侧播放声音 谷歌搜索没有成功 也许我使用了错误的术语 也许使用 WIN32 API 设置余额 如果您谈论的是立体声扬声器系统设置中的 2 个扬声器 那
  • java spring缓存会破坏反射吗?

    我最近正在使用 spring boot 和集成缓存 在我的测试中 我使用了一点反射 这是一个例子 Service public class MyService private boolean fieldOfMyService false p
  • 获取回形针附件的绝对 URL

    是否可以获取回形针附件的绝对 URI 目前的问题是生产环境部署在子 URI 中 在 Passenger 上 RackBaseURI but
  • 如何从内存中为 CircleAvatar 提供图像

    我正在使用带有 backgroundImage 属性的 CircleAvatar 来加载从内存中获取的图像 但出现错误 如何在 flutter 中设置 CircleAvatar 中的 image memory String url GetI
  • 断点改变程序流程

    我正在尝试分析和逆向我拥有的 Objective C 程序 我通过手动更改一些操作码对可执行文件进行了一些修改 然而 当我测试修改后的软件时 我得到 死亡人数 9 没关系 我想我触碰了不该触碰的东西 我当时就推出了gdb myprogram
  • Istio 允许在 Docker Desktop Kubernetes 上使用第三方 JWT

    我使用的是 docker 桌面附带的预打包 Kubernetes 集群 我在 Windows 计算机上 使用 WSL 2 在 Ubuntu 18 04 VM 上运行 Kubernetes 在我的 Kubernetes 集群上 我运行 ist
  • 如何从 Chrome 扩展中的 bg 页面访问弹出页面 DOM?

    在谷歌浏览器中扩展开发者部分 http code google com chrome extensions overview html 它说 扩展内的 HTML 页面 可以完全访问彼此的 DOM 它们可以调用函数 彼此 弹出窗口的内容 是由
  • 何时调用layoutSubviews?

    我有一个自定义视图没有得到layoutSubview动画期间的消息 我有一个充满屏幕的视图 它在屏幕底部有一个自定义子视图 如果我更改导航栏的高度 它可以在 Interface Builder 中正确调整大小 layoutSubviews在
  • git 在推/拉时加密/解密远程存储库文件

    在传输到远程存储库之前是否可以通过 git Push 自动加密文件 并在 git pull 时自动解码它们 也就是说 如果我有一些与 git 存储库共享访问的远程服务器 并且我不希望我们的项目在未经许可的情况下被盗 也许在推之前和拉之后有一
  • NHibernate - 如何使用参数值记录命名参数化查询?

    我有一个参数化的命名查询 如下所示 Query moveOutQuery session createSQLQuery moveOutQueryStr toString addEntity MyClass class setParamete