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

因此我们创建一个查询类

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

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

EntityManager entityManager;

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getInfoWebWaring(String column){
String SQL </span>= "SELECT "+column+" FROM config LIMIT 1"<span style="color: #000000;">;
Object obj </span>=<span style="color: #000000;"> entityManager.createNativeQuery(SQL).getSingleResult(); </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> String.valueOf(obj);
} </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WebInfo getWebInfo(String [] args){ String SQL </span>= "SELECT id, "+<span style="color: #000000;">
args[</span>0]+" log_url, "+<span style="color: #000000;">
args[</span>1]+" title, "+<span style="color: #000000;">
args[</span>2]+" key_word, "+<span style="color: #000000;">
args[</span>3]+" description, "+<span style="color: #000000;">
args[</span>4]+" address, "+<span style="color: #000000;">
args[</span>5]+" contact "+
"FROM config LIMIT 1"<span style="color: #000000;">; WebInfo webInfo </span>= (WebInfo) entityManager.createNativeQuery(SQL,WebInfo.<span style="color: #0000ff;">class</span><span style="color: #000000;">).getSingleResult(); </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> webInfo;
}

}

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

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import javax.persistence.*; @Data //生成读写方法

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

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

@Accessors(chain = true)

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

public class WebInfo {

@Id

@GeneratedValue(strategy= GenerationType.AUTO)

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

private Integer id;

@Column(name = "log_url")

private String logUrl;

@Column(name = "title")

private String title;

@Column(name = "key_word")

private String keyWord;

@Column(name = "description")

private String description;

@Column(name = "address")

private String address;

@Column(name = "contact")

private String contact; }

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

调用方式如下:

import org.springframework.stereotype.Service;
import com.weiqitonggame.trade.service.InformationService;
import org.springframework.beans.factory.annotation.Autowired;
import com.weiqitonggame.trade.dao.InformationDaoEM;
import com.weiqitonggame.trade.model.WebInfo; @Service //标记为service

public class InformationServiceImpl implements InformationService {
@Autowired  </span><span style="color: #008000;">//</span><span style="color: #008000;">注入informationDaoEM</span>
<span style="color: #0000ff;">private</span><span style="color: #000000;"> InformationDaoEM informationDaoEM; @Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getWebWaring(String column) { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> informationDaoEM.getInfoWebWaring(column);
} @Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WebInfo getWebInfo(String[] args) { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> informationDaoEM.getWebInfo(args);
}

}

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. 通用maper无法获取实体类com.qmtt.model.PhWxUser对应的表名问题

    spring boot在采用了热加载后,可能会出现“无法获取实体类com.qmtt.model.PhWxUser对应的表名!”的异常, 解决办法 在resources新建一个文件夹META-INF,新 ...

  2. 成为Android高手必须掌握的8项基本要求

    [1] Android操作系统概述 1. Android系统架构. 2. Android利用设计理念. 3. Android 开源知识. 4. Android 参考网站与权威信息.[2] Androi ...

  3. 031_spark架构原理

    spark核心组件 driver master worker executor task(只有task是线程) 核心组件的原理图解

  4. jmeter+ant+jenkins

    前提:需要先配置下面两个环境,严格按照本人的配置去配,要不然后面你会看不懂 (1)ant+jmeter集成:http://blog.csdn.net/qq_23101033/article/detai ...

  5. php用面向对象从mysql取数据

    <?php //建立数据库的链接@$_mysqli = new mysqli('localhost','root','123456','dbname');if(mysqli_connect_er ...

  6. PHP一句话后门过狗姿势万千之传输层加工

    既然木马已就绪,那么想要利用木马,必然有一个数据传输的过程,数据提交是必须的,数据返回一般也会有的,除非执行特殊命令. 当我们用普通菜刀连接后门时,数据时如何提交的,狗狗又是如何识别的,下面结合一个实 ...

  7. SQLite -创建表

    SQLite -创建表 SQLite CREATE TABLE语句用于创建一个新表在任何给定的数据库.创建一个基本表包括表命名和定义其列,每列的数据类型 语法: CREATE TABLE语句的基本语法 ...

  8. JQQ文字素材

    1.十二生肖:子鼠.丑牛.寅虎.卯兔.辰龙.巳舍.午马.未羊.申猴.酉鸡.戌狗.亥猪.丙申年(2016)乙未年(2015)甲午年(2014)癸巳年(2013)壬辰年(2012)辛卯年(2011)庚寅年 ...

  9. uva1608 Non-boring sequences

    某个序列找到唯一元素后,判断被分成的两边的序列即可问题在于找到唯一元素连续序列,重复元素的问题:感觉很有一般性 查找相同元素用map,last,next存上一个相同元素的位置复杂度计算有点思考:记录l ...

  10. 使用snapshot继续训练网络

    注意:snapshots和weights不能同时使用 用预训练模型进行finetune是以下命令: ./build/tools/caffe train --solver=examples/XXX/le ...