最近遇到一个需求,查询数据库中对应表的字段是动态的,项目使用的框架使用JPA+Spring Boot,JPA自带原生SQL支持的传入参数是强类型的,无法用于查询语句的字段更改,因为插入字符串的话带有单引号,需要另外定义原生SQL

因此我们创建一个查询类

  1. import com.weiqitonggame.trade.model.WebInfo;
  2. import org.springframework.stereotype.Component;
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.PersistenceContext;
  5.  
  6. @Component //标记为组件,spring启动时会将该类扫描进容器

  7. public class InformationDaoEM {
  8. @PersistenceContext </span><span style="color: #008000;">//</span><span style="color: #008000;">注入的是实体管理器,执行持久化操作</span>
  9.  
  10. EntityManager entityManager;

  11. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getInfoWebWaring(String column){
  12.     String SQL </span>= "SELECT "+column+" FROM config LIMIT 1"<span style="color: #000000;">;
  13.     Object obj </span>=<span style="color: #000000;"> entityManager.createNativeQuery(SQL).getSingleResult();
  14.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> String.valueOf(obj);
  15. }
  16. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WebInfo getWebInfo(String [] args){
  17.     String SQL </span>= "SELECT id, "+<span style="color: #000000;">
  18.             args[</span>0]+" log_url, "+<span style="color: #000000;">
  19.             args[</span>1]+" title, "+<span style="color: #000000;">
  20.             args[</span>2]+" key_word, "+<span style="color: #000000;">
  21.             args[</span>3]+" description, "+<span style="color: #000000;">
  22.             args[</span>4]+" address, "+<span style="color: #000000;">
  23.             args[</span>5]+" contact "+
  24.             "FROM config LIMIT 1"<span style="color: #000000;">;
  25.     WebInfo webInfo </span>= (WebInfo) entityManager.createNativeQuery(SQL,WebInfo.<span style="color: #0000ff;">class</span><span style="color: #000000;">).getSingleResult();
  26.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> webInfo;
  27. }
  28.  
  29. }

其中
EntityManager.createNativeQuery(SQL)返回的是Object对象
entityManager.createNativeQuery(SQL,WebInfo.class)返回的是映射后的实例对象
实体类WebInfo需要进行以下处理,确保被扫描进spring容器

  1. import lombok.AllArgsConstructor;
  2. import lombok.Data;
  3. import lombok.NoArgsConstructor;
  4. import lombok.experimental.Accessors;
  5.  
  6. import javax.persistence.*;
  7.  
  8. @Data //生成读写方法

  9. @AllArgsConstructor //生成全参构造方法

  10. @NoArgsConstructor //生成无参构造方法

  11. @Accessors(chain = true)

  12. @Entity(name = "tableName") //标记为entity

  13. public class WebInfo {

  14. @Id

  15. @GeneratedValue(strategy= GenerationType.AUTO)

  16. @Column(name = "id") //查询结果对应字段

  17. private Integer id;

  18. @Column(name = "log_url")

  19. private String logUrl;

  20. @Column(name = "title")

  21. private String title;

  22. @Column(name = "key_word")

  23. private String keyWord;

  24. @Column(name = "description")

  25. private String description;

  26. @Column(name = "address")

  27. private String address;

  28. @Column(name = "contact")

  29. private String contact;
  30.  
  31. }

Query.getSingleResult() 执行SQL语句,返回一个查询结果,常用的还有以下方法
Query.getResultList() () 执行SQL语句,返回一个List集合
Query.getFirstResult() () 执行SQL语句,返回一个系列结果集合的第一个

调用方式如下:

  1. import org.springframework.stereotype.Service;
  2. import com.weiqitonggame.trade.service.InformationService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import com.weiqitonggame.trade.dao.InformationDaoEM;
  5. import com.weiqitonggame.trade.model.WebInfo;
  6.  
  7. @Service //标记为service

  8. public class InformationServiceImpl implements InformationService {
  9. @Autowired  </span><span style="color: #008000;">//</span><span style="color: #008000;">注入informationDaoEM</span>
  10. <span style="color: #0000ff;">private</span><span style="color: #000000;"> InformationDaoEM informationDaoEM;
  11. @Override
  12. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getWebWaring(String column) {
  13.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> informationDaoEM.getInfoWebWaring(column);
  14. }
  15. @Override
  16. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WebInfo getWebInfo(String[] args) {
  17.     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> informationDaoEM.getWebInfo(args);
  18. }
  19.  
  20. }

JPA框架下使用纯粹的原生SQL的更多相关文章

  1. hibernate使用原生SQL查询返回结果集的处理

    今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQu ...

  2. SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询

    上一篇介绍了入门基础篇SpringDataJPA访问数据库.本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询.部分字段映射.分页等.本文尽量以简单的建模与代码进行展 ...

  3. thinkPHP框架中执行原生SQL语句的方法

    这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...

  4. JPA或Hibernate中使用原生SQL实现分页查询、排序

    发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中 ...

  5. PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

    PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...

  6. jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本

    -----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join).  上代码了 1.我们要联查房屋和房屋用户中间表,通过 ...

  7. spring data jpa使用原生sql查询

    spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...

  8. 管中窥豹——框架下的SQL注入 Java篇

    管中窥豹--框架下的SQL注入 Java篇 背景 SQL注入漏洞应该算是很有年代感的漏洞了,但是现在依然活跃在各大漏洞榜单中,究其原因还是数据和代码的问题. SQL 语句在DBMS系统中作为表达式被解 ...

  9. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

随机推荐

  1. C#结构体和类的区别(转)

    结构体和类的区别:    在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体有啥不同,虽 ...

  2. JAVA 运用流编程实现简单的"记事本"功能

    一.概要 1.功能介绍 2.实现的思路及步骤代码 3.完整代码 二.功能 运用IO流和Swing实现简单的记事本功能(打开.保存.退出) 三.思路及实现步骤 1.在构造函数中画出操作界面 //创建jt ...

  3. 使用NPOI操作Excel文件及其日期处理

    工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...

  4. 【学习笔记】深入理解js原型和闭包(18)——补充:上下文环境和作用域的关系

    本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...

  5. <meta>详解

    一.元数据和<meta> 元数据是描述以提供关于其他数据的数据,在<meta>中,html document是被描述的数据,meta标签中包括的数据是描述html docume ...

  6. git diff查看修改,出现^M换行问题

    通过命令git diff查看修改,出现^M换行问题,如图: 解决: git config --global core.whitespace cr-at-eol 换行符的问题: 提交时转换为LF,检出时 ...

  7. windows 查看某端口被占用情况

    百度经验 http://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html 基本命令 netstat -ano

  8. IOS文件下载

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, ...

  9. js获取服务器生成并返回客户端呈现给客户的控件id的方法

    var repeaterId = '<%=rpData.ClientID %>'; //Repeater的客户端IDvar rows = <%=rpData.Items.Count% ...

  10. vba,自定义公式,农历互转公历,excel ,wps

    'vba 模块内容如下 自定义公式 '公历转农历模块 '原创:互联网 '修正: '// 农历数据定义 // '先以 H2B 函数还原成长度为 18 的字符串,其定义如下: '前12个字节代表1-12月 ...