获得Hibernate Criteria的原生SQL

2023-10-20 07:08

本文主要是介绍获得Hibernate Criteria的原生SQL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于Hibernate QBC查询,有时候我们会遇到需要获得最终SQL的需求,但是Hibernate本身并没有提供该方法。

虽然我们可以使用诸如p6spy之类的第三方组件来输出实际SQL日志,但是那是通过拦截dataSource-SQL实现的。我们仍然无法在程序内部获得最终实际的SQL代码。

那么如何在程序中获得SQL呢。其实有一个方法,那就是模拟一遍Hibernate中Criteria生成SQL的全部过程。

此处提供一个方法,用于通过criteria获取实际SQL:

public static String getCriteriaSql(Criteria criteria) {CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;//转型SessionImplementor session = criteriaImpl.getSession();//获取SESSIONSessionFactoryImplementor factory = session.getFactory();//获取FACTORYCriteriaQueryTranslator translator = new CriteriaQueryTranslator(factory, criteriaImpl, criteriaImpl.getEntityOrClassName(), CriteriaQueryTranslator.ROOT_SQL_ALIAS);String[] implementors = factory.getImplementors(criteriaImpl.getEntityOrClassName());CriteriaJoinWalker walker = new CriteriaJoinWalker((OuterJoinLoadable) factory.getEntityPersister(implementors[0]), translator, factory, criteriaImpl, criteriaImpl.getEntityOrClassName(), session.getEnabledFilters());return walker.getSQLString();
}


结果如:

/* criteria query */
select this_.id                     as id166_0_,this_.arrive_station_code    as arrive2_166_0_,this_.arrive_station_name    as arrive3_166_0_,this_.clearing_code          as clearing4_166_0_,this_.clearing_name          as clearing5_166_0_,this_.company_type           as company6_166_0_,this_.config_memo            as config7_166_0_,this_.confirm_count          as confirm8_166_0_,this_.confirm_date           as confirm9_166_0_,this_.confirm_quantity       as confirm10_166_0_,this_.confirmor              as confirmor166_0_,this_.confirmor_name         as confirmor12_166_0_,this_.cut_count              as cut13_166_0_,this_.cut_qty                as cut14_166_0_,this_.cut_tag                as cut15_166_0_,this_.delivery_code          as delivery16_166_0_,this_.delivery_name          as delivery17_166_0_,this_.dept_code              as dept18_166_0_,this_.dept_name              as dept19_166_0_,this_.dy_reject              as dy20_166_0_,this_.dy_reject_code         as dy21_166_0_,this_.flow_code              as flow22_166_0_,this_.flow_name              as flow23_166_0_,this_.going_code             as going24_166_0_,this_.going_name             as going25_166_0_,this_.is_ocena_shipping      as is26_166_0_,this_.oil_code               as oil27_166_0_,this_.oil_name               as oil28_166_0_,this_.outcontrol_tag         as outcontrol29_166_0_,this_.plan_date              as plan30_166_0_,this_.plan_station_code      as plan31_166_0_,this_.producer               as producer166_0_,this_.producer_date          as producer33_166_0_,this_.producer_name          as producer34_166_0_,this_.quantity               as quantity166_0_,this_.railway_name           as railway36_166_0_,this_.reject                 as reject166_0_,this_.reject_code            as reject38_166_0_,this_.remain_count           as remain39_166_0_,this_.remain_quantity        as remain40_166_0_,this_.remark                 as remark166_0_,this_.rerceiv_unit_code      as rerceiv42_166_0_,this_.rerceiv_unit_name      as rerceiv43_166_0_,this_.return_count           as return44_166_0_,this_.return_quantity        as return45_166_0_,this_.special                as special166_0_,this_.start_station_code     as start47_166_0_,this_.start_station_name     as start48_166_0_,this_.start_station_type     as start49_166_0_,this_.status                 as status166_0_,this_.storage_point_code     as storage51_166_0_,this_.storage_point_name     as storage52_166_0_,this_.suggestion_end_date    as suggestion53_166_0_,this_.tank_count             as tank54_166_0_,this_.target_code            as target55_166_0_,this_.target_name            as target56_166_0_,this_.transport_type_code    as transport57_166_0_,this_.transport_type_name    as transport58_166_0_,this_.uninstall_oiltank_code as uninstall59_166_0_,this_.uninstall_oiltank_name as uninstall60_166_0_,this_.verifier               as verifier166_0_,this_.verifier_name          as verifier62_166_0_,this_.verify_date            as verify63_166_0_from p_station_multiple this_where this_.company_type = ?and this_.plan_date = ?and this_.target_code = ?



 

这篇关于获得Hibernate Criteria的原生SQL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245501

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二