将原生SQL功能Hibernate到您的Spring Data Repository中

JPA为您提供@NamedNativeQuery以便使用本机SQL。 但是,用法并不方便,特别是当您需要在本机SQL中映射多个实体时。 您必须定义一组SqlResultSetMapping映射,这很容易出错。

对于以前使用过Hibernate本机SQL功能的用户,您会发现它比JPA的@NamedNativeQuery更易于使用。 在最近的项目中,我正在使用Spring Data JPA。 我已将Hibernate的本机查询功能添加到我的Spring数据库中。 现在,您可以在JPA中执行本机查询,而无需使用SqlResultSetMapping。

1.添加您的客户注解@NativeQueries和@NativeQuery

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeQueries {NativeQuery[] queries() default  {};
}
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeQuery {String name()  default "";String sql()  default "";
}

2.在基础Spring Data Repository中添加“ queryNatively”方法。

如果您不知道如何向Spring数据JPA基础存储库添加自定义行为,请参阅我以前的文章, 了解如何自定义Spring数据JPA基础存储库 。 您可以在上一篇文章中看到,我有意在GenericRepositoryImpl中公开存储库接口(即springDataRepositoryInterface属性)。 这些小技巧使我能够轻松访问存储库界面中的注释。

public List queryNatively(String nativeQueryName, LinkedHashMap<String,Class<?>> inEntityClasses, Map inParams ){SQLQuery query =  this.createHibernateNativeQuery( nativeQueryName,  inParams );//add entitiesif (inEntityClasses!=null) {      for (Object key: inEntityClasses.keySet()) {String entityClassAlias = key.toString();Class<?> entityClass = (Class<?>)inEntityClasses.get(key);  query.addEntity(entityClassAlias,entityClass);}    }//add parameterif (inParams != null){for (Object key: inParams.keySet()) {String queryParamName = key.toString();Object queryParamValue = inParams.get(key);query.setParameter(queryParamName, queryParamValue);}}  return (query!=null)? query.list() : null ;}private SQLQuery createHibernateNativeQuery (String nativeQueryName, Map inParams ){if (GenericRepository.class.isAssignableFrom(getSpringDataRepositoryInterface())) {Annotation nativeQueryAnn = getSpringDataRepositoryInterface().getAnnotation(NativeQueries.class);if(nativeQueryAnn != null){NativeQueries nativeQueries = (NativeQueries)nativeQueryAnn;NativeQuery[] queries  = nativeQueries.queries();for (NativeQuery sqlquery : queries) { if (StringUtils.equals(nativeQueryName, sqlquery.name())) {String sql  = sqlquery.sql();Session hiernateSess = em.unwrap(Session.class);SQLQuery query = hiernateSess.createSQLQuery(sql);//add parameterif (inParams != null){for (Object key: inParams.keySet()) {String queryParamName = key.toString();Object queryParamValue = inParams.get(key);query.setParameter(queryParamName, queryParamValue);}}  return query;}    }}}return null;}

3.示例用法

在存储库界面中,通过@NativeQueries和@NativeQuery批注定义要使用的本机SQL查询。 用法与调用Hibernate本机查询功能相似。 您可能只看到Hibernate别名和属性引用 。

@NativeQueries (queries = {@NativeQuery(name="query1", sql="SELECT {cat.*}, {mother.*}  FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID and c.name =  :catName "),@NativeQuery(name="query2", sql="SELECT {cat.*} FROM CATS where c.ID =  :catName")       }
)
public interface CatRepository extends GenericRepository<Cat, Long> {
}

在注入存储库的服务或业务类中,您只需简单地调用queryNatively()方法即可执行本机SQL查询。

@Service
public class CatService {@Injectprivate CatRepository catRepository;public List<Cat> searchCat( String catName) {List<Cat> catList;// Add entity mapping for your queryHashMap<String, Object> inParams = new HashMap<String, Object>();inParams.put("catName", "Felix");// Prepare parameters for your native sqlLinkedHashMap<String, Object> entityMap = new LinkedHashMap<String, Object>();entityMap.put("cat", Cat.class);entityMap.put("mother",Mother.class);catList = catRepository.queryNatively("query1", "",entityParam);return catList;}
}

参考:来自Programming Peacely博客的JCG合作伙伴 Boris Lam 向您的Spring Data Repository中添加了Hibernate本机SQL功能 。


翻译自: https://www.javacodegeeks.com/2012/08/hibernate-native-sql-features-into-your.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

daterangepicker双日历插件的使用

今天主要是由于项目的需要&#xff0c;做了一个daterangepicker双日历插件&#xff0c;做出来的效果如下&#xff1a; 个人感觉这个daterangepicker双日历插件很好用&#xff0c;并且实现起来也不是很麻烦&#xff0c;我是根据它的官方文档去写的&#xff0c;并将Bootstrap也整…

php 递归展现城市信息,PHP 递归兑现层级树状展现数据

PHP 递归实现层级树状展现数据?$arr[id],fid > $arr[fid],name > $arr[name],);}// 将数据按照缩进简单排列 见图1function data2arr($tree, $rootId 0, $level 0) {foreach($tree as $leaf) {if($leaf[fid] $rootId) {echo str_repeat( , $level) . $leaf[id] . .…

牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...

H.Tree Recovery时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K64bit IO Format: %lld链接&#xff1a;https://www.nowcoder.com/acm/contest/77/H来源&#xff1a;牛客网题目描述 You have N integers, A1,…

面向对象的代码生成方法

代码生成是减少无聊任务的不健康负担的一种常用方法&#xff0c;这些任务常常使我们急切的代码苦恼。 我见过的许多代码生成框架都使用模板替换重复方法&#xff0c;在该方法中&#xff0c;您可以编写一个模板&#xff0c;以了解生成的代码文件的外观&#xff0c;然后替换某些关…

t oracle删除吗,Oracle 11g 手工建库与删库

Oracle 11g 手工建库与删库在前一篇文章中提到阅读Oracle 11gR2 Administrator‘sGuide(文档编号E25494-01)时&#xff0c;简单描述了DDL_LOCK_TIMEOUT参数。在Oracle 11gR2Administrator‘s Guide文档的chapter 2 Creating and Configuring anOracle Database章节时&#xff0…

oracle连接满报错日志,Oracle归档日志满了导致Oracle连接(ORA-00257)报错处理

最近一段时间&#xff0c;有收到一台Oracle服务器的连接告警&#xff0c; 刚刚开始还以为是Oracle的监听被关闭导致&#xff0c;结果连上服务器看下Oracle的监听进程正常&#xff0c;自己连接一次发现有报ORA-00257错&#xff0c;又去监控系统中在看下日志再用sqlplus连上Oracl…

微信登陆超时 重新登录_重新登录:重新登录

微信登陆超时 重新登录嗨&#xff0c;我再次感到非常高兴&#xff0c;认为日志记录是任何应用程序设计和开发的固有部分。 我是坚强的基础知识的忠实拥护者&#xff0c;以我的拙见&#xff0c;日志记录是任何企业级应用程序中经常被忽略但基本的关键要素之一。 我已经写在此之前…

HBase错误:ERROR: Can't get master address from ZooKeeper; znode data == null 解决办法

一、问题背景 使用命令 $ hbase shell 进入hbase的shell之后使用create命令创建表时出现错误&#xff1a;ERROR: Cant get master address from ZooKeeper; znode data null 二、解决方法 检查${HBASE_HOME}/conf/hbase-site.html的属性hbase.rootdir <property><na…

oracle中OEM证书失效怎么办,安全证书过期怎么办 网站安全证书失效处理【解决方法】...

安全证书过期怎么办?所谓的网站安全证书是通过在客户端浏览器和Web服务器之间建立一条SSL安全通道保证了双方传递信息的安全性&#xff0c;而且用户可以通过服务器证书验证他所访问的网站是否真实可靠。下面&#xff0c;我们就来看看网站安全证书失效处理方法。一、计算机中的…

JavaFX缺少的功能调查:表视图

JavaFX的TableView&#xff08;和TreeTableView&#xff09;赢得了我最近的“ JavaFX缺失功能”调查以及许多后续讨论中&#xff08;尤其是苏黎世JavaFX Meetup小组的成员 &#xff09;中提到最多的控件的价格。 &#xff09;。 我想原因之一是一个简单的事实&#xff0c;即几乎…

快速幂矩阵快速幂

快速幂 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想&#xff0c;即将\(a^{b}\)的指数b不断分解成二进制的形式&#xff0c;然后相乘累加起来&#xff0c;就是用\(a^{b/2}a^{b/2}\)去求\(a{^b}\)。 例如:\(a^{11}a^{(2^02^12^3)}\)…

前端项目里常见的十种报错及其解决办法

错误一&#xff1a;Uncaught TypeError: Cannot set property onclick of nullat operate.js:86图片.png原因&#xff1a;当js文件放在head里面时&#xff0c;如果绑定了onclick事件&#xff0c;就会出现这样的错误&#xff0c;是因为W3School的写法是浏览器先加载完按钮节点才…

监控oracle数据io,Prometheus监控Oracle数据库

背景本文简单介绍下&#xff0c;Prometheus如何通过exporters监控Oracle数据库&#xff0c;以及应该注意哪些指标。oracledb_exporteroracledb_exporter是一个连接到Oracle数据库并生成Prometheus metrics的应用程序&#xff0c;设置展示下如何安装和设置oracledb_exporter&…

默认HotSpot最大直接内存大小

在我以前的博客文章热点选项中的Java 8改进的文档 &#xff0c;我写的误解围绕热点JVM非标准的默认设置选项 -XX:MaxDirectMemorySize 。 在本文中&#xff0c;我介绍了一种确定HotSpot JVM中“默认”最大直接内存大小的简单方法。 Java启动器的Java 8文档针对-XX:MaxDirectMe…

window 下 Atom 侧边栏字体大小设置

在 File 处找到 Settings 点击找到 Themes 点击找到 your stylesheet 点击在 .tree-view 处设置即可, (按照 css 样式来写即可保存生效)。转载于:https://www.cnblogs.com/zhourongcode/p/8521317.html

php workman 多线程,workerman如何多线程

Workerman有一个依赖pthreads扩展的MT多线程版本&#xff0c;但是由于pthreads扩展还不够稳定&#xff0c;所以这个Workerman多线程版本已经不再维护。 (推荐学习&#xff1a; workerman教程)workerman\mqtt 是一个基于workerman的异步mqtt 客户端库&#xff0c;可用于接收或者…

python面向对象封装

封装是指将功能模块化&#xff0c;比如&#xff0c;我们写了一个求和函数就是封装&#xff0c;函数使用者不需要了解函数内部是如何实现求和的&#xff0c;只需要调用我们写好的函数就行了。把很多数据封装到一个对象中&#xff0c;把固定功能的代码封装到一个代码块&#xff0…

Java嵌入oracle,Java插入Oracle Spatial空间数据

Java读取地理信息数据文件&#xff0c;并将其存入Oracle数据库。package file;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Res…

js Object的属性 Configurable,Enumerable,Writable,Value,Getter,Setter

对象的数据属性 Configurable,Enumerable,Writable,Value var person {} Object.defineProperty(person,name,{configurable:false,//能否使用delete、能否需改属性特性、或能否修改访问器属性、&#xff0c;false为不可重新定义&#xff0c;默认值为true enumerable:false,//…

SpringBoot AutoConfiguration魔术如何工作?

在我以前的文章中&#xff0c; 为什么选择SpringBoot&#xff1f; 我们已经研究了如何创建SpringBoot应用程序。 但是您可能会也可能不会了解幕后发生的事情。 您可能想了解SpringBoot自动配置背后的魔力。 但是在此之前&#xff0c;您应该了解Spring的Conditional功能&#x…