springDataJPQL实现增删改查及分页,原生sql查询,根据方法命名规则实现查询以及Specification查询
一、使用方法
1、在dao中定义开一个方法,使用方法的参数设置jpql,并且使用方法的返回值接受查询结果,在方法上添加@query注解,在注解中写jpql语句进行增删改查,测试
2、使用原生的sql语句:dao中定义一个方法,在方法中添加@query注解,在注解中添加原生sql语句,并且添加一个属性:nativeQuery=true,测试
3、方法命名规则查询:
通过以肯定的规则,定义一个方法,框架本身就可以根据方法名生成一块个sql语句进行查询,规则:
1、必须以findBy开头
2、查询某个字段,findBy后跟实体类的属性名称
3、如果有多个条件,就在方法后加And后跟实体类的属性名
4、方法的参数对应查询的定义
5、返回值根据返回值的数据类型定义;如果是分页查询,在方法中添加一个参数Pageable即可
4、使用Specification方式进行查询:最强大的查询方式 ,除了原生的SQL 语句以外还有最复杂的查询方式
1、要在dao 继承JpaSeciFicationExection 接口
2、使用JpaSeciFicationExection 接口 中提供的方法进行查询并且每个方法都需要使用Specification对象作为参数
二、、编写实现类
package cn.zrf.jpa.entity; import javax.persistence.*; @Entity
@Table(name = "cust_customer")
public class Customer {
// 配置主键自增的策略
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name="cust_id")
private long custId;
@Column(name="cust_name")
private String custName;
@Column(name="cust_source")
private String custSource;
@Column(name="cust_indutry")
private String custIndutry;
@Column(name="cust_level")
private String custLevel;
@Column(name="cust_address")
private String custAddress;
@Column(name="cust_phone")
private String custPhone; @Override
public String toString() {
return "Customer{" +
"custId=" + custId +
", custName='" + custName + '\'' +
", custSource='" + custSource + '\'' +
", custIndutry='" + custIndutry + '\'' +
", custLevel='" + custLevel + '\'' +
", custAddress='" + custAddress + '\'' +
", custPhone='" + custPhone + '\'' +
'}';
} public long getCustId() {
return custId;
} public void setCustId(long custId) {
this.custId = custId;
} public String getCustName() {
return custName;
} public void setCustName(String custName) {
this.custName = custName;
} public String getCustSource() {
return custSource;
} public void setCustSource(String custSource) {
this.custSource = custSource;
} public String getCustIndutry() {
return custIndutry;
} public void setCustIndutry(String custIndutry) {
this.custIndutry = custIndutry;
} public String getCustLevel() {
return custLevel;
} public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
} public String getCustAddress() {
return custAddress;
} public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
} public String getCustPhone() {
return custPhone;
} public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
}
三、编写dao
package cn.zrf.jpa.dao; import cn.zrf.jpa.entity.Customer;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query; import java.util.List; public interface CustomerDao extends JpaRepository<Customer,Long>,JpaSpecificationExecutor<Customer> {
//查询全部
@Query("from Customer")
List<Customer> getAllCustomer();
//查询全部并分页
@Query("from Customer ")
List<Customer> getAllCustomerByPage(Pageable pageable);
//条件查询(根据ID查询)
@Query("from Customer where cust_id = ?")
Customer getCustomerById(Long id);
//根据地址,姓名模糊查询
@Query("from Customer where custAddress like ? and custName like ?")
List<Customer> getCustList(String address,String custName);
//根据ID进行局部更新操作
@Query("update Customer set cust_name=? where custId=?")
@Modifying
void getUpdateById(String name,Long id);
//原生sql语句模糊查询操作
@Query(value = "select * from cust_customer where cust_name like ?",nativeQuery = true)
List<Customer> getCustomerListByNative(String name);
//方法命名规则查询
/**1 应该使用findBy开头
* 2 查询某个字段 findBy后跟实体类的属性的名称
* 3 如果有多个条件 就在方法后加And+实体类的属性名
* 4 方法的参数 对应查询的定义
* 5 返回值根据返回的数据类型定义
* 6 如果需要分页查询 在方法中添加一个参数Pageable 即可
*/
//根据ID查询
Customer findByCustId(Long id);
//根据姓名,地址进行模糊查询
List<Customer> findByCustNameLikeAndCustAddressLike(String name,String address);
//分页查询
List<Customer> findByCustAddressLike(String address, Pageable pageable);
}
四、测试类
package cn.jpa.test; import cn.zrf.jpa.dao.CustomerDao;
import cn.zrf.jpa.entity.Customer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; import java.awt.print.Pageable;
import java.util.List; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestJpql {
@Autowired
CustomerDao customerDao;
//查询全部
@Test
public void getAllCustomerTest(){
List<Customer> list = customerDao.getAllCustomer();
for (Customer customer:list){
System.out.println(customer);
}
}
//查询全部并分页
@Test
public void getAllCustomerByPageTest(){
List<Customer> list = customerDao.getAllCustomerByPage(new PageRequest(0, 3));
for (Customer customer:list){
System.out.println(customer);
}
}
//根据ID查询
@Test
public void getCustomerByIdTest(){
Customer customer = customerDao.getCustomerById(1l);
System.out.println(customer);
}
//根据地址,姓名进行模糊查询
@Test
public void getCuseListTest(){
List<Customer> custList = customerDao.getCustList("%京%", "%长%");
for (Customer customer:custList){
System.out.println(customer);
}
}
//根据ID进行局部更新操作
@Test
@Transactional
@Commit
public void getUpdateByIdTest(){
customerDao.getUpdateById("张无忌",3l);
}
//原生sql语句模糊查询
@Test
public void getCustomerByNativeTest(){
List<Customer> list = customerDao.getCustomerListByNative("%长%");
for (Customer customer:list){
System.out.println(customer);
}
}
//方法命名规则查询测试
//根据ID查询
@Test
public void findByIdTest(){
Customer customer = customerDao.findByCustId(1L);
System.out.println(customer);
}
//根据地址,姓名进行模糊查询
@Test
public void findByCustNameLikeAndAddressLike(){
List<Customer> list = customerDao.findByCustNameLikeAndCustAddressLike("%张%","%京%");
for (Customer customer:list){
System.out.println(customer);
}
}
//根据地址进行分页查询
@Test
public void findByCustAddressLike(){
List<Customer> list = customerDao.findByCustAddressLike("%京%", new PageRequest(0, 3));
for (Customer customer:list){
System.out.println(customer);
}
}
//使用Specification方式进行查询
//根据ID进行查询
@Test
public void findByIdSpecification(){
Customer customer = customerDao.findOne(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//参数1、字段名 参数2、字段值
Predicate predicate = criteriaBuilder.equal(root.get("custId"), 1l);
return predicate;
}
});
System.out.println(customer);
}
//根据姓名、地址进行模糊查询
@Test
public void findByNameAndAddress(){
customerDao.findAll(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//创建根据模糊查询的条件
Predicate custName = criteriaBuilder.like(root.get("custName"), "%长%");
Predicate custAddress = criteriaBuilder.like(root.get("custAddress"), "%京%");
//把两个条件进行组合
Predicate predicate = criteriaBuilder.and(custName, custAddress);
return predicate;
}
}).forEach(c-> System.out.println(c));//forEach(System.out::println);
// for(Customer customer:list){
// System.out.println(customer);
// }
}
//根据姓名、地址进行分页查询
@Test
public void findByCustNameAndCustAddressPage(){
Page page = customerDao.findAll(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//创建根据模糊查询条件
Predicate custName = criteriaBuilder.like(root.get("custName"), "%长%");
Predicate custAddress = criteriaBuilder.like(root.get("custAddress"), "%京%");
//组合两个条件
Predicate predicate = criteriaBuilder.and(custName, custAddress);
return predicate;
}
},new PageRequest(0,3));
System.out.println("总条数"+page.getTotalElements());
System.out.println("总页数"+page.getTotalPages());
List list = page.getContent();
for (Customer customer:list){
System.out.println(customer);
}
}
}
springDataJPQL实现增删改查及分页,原生sql查询,根据方法命名规则实现查询以及Specification查询的更多相关文章
- SpringBoot JPA实现增删改查、分页、排序、事务操作等功能
今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能.下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and ...
- 用SpringBoot+MySql+JPA实现对数据库的增删改查和分页
使用SpringBoot+Mysql+JPA实现对数据库的增删改查和分页 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述 ...
- SpringBoot-Vue实现增删改查及分页小DEMO
前言 主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo,实现增删改查.分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程. 开发栈 前端 开 ...
- Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码
关于T4代码生成这块,我之前写过几篇帖子,如:<Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)>(http://www.cnblogs.co ...
- 一个Solr搜索实例,增删改查+高亮+分页
今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...
- 自己写的一个Solr搜索实例,增删改查+高亮+分页
今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...
- JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能
一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...
- VS2012里面使用EF框架的增删改查和分页的方法
public class BaseRepository<T> where T : class { //实例化EF框架 DataModelContainer ...
- 使用ListView+ObjectDataSource+DataPager实现增删改查加分页
一.配置objectDataSource 选择业务逻辑层的类 二.配置Select对应的方法,必须是一个带两个整型参数的方法,第一个参数表示要查看的第一条记录的前一条30,第二个参数每页最多能显示的记 ...
随机推荐
- 4. Object
1. Object.is( ); //用来判断,不同等 == 与===接近.NaN作出的调整 let obj={a:1,b:2}; Object.is(obj,obj);//true Object. ...
- centos7 —— 网络连接问题
今天用虚拟机(VM)安装好centos7后,发现无法连接网络,百思不得其解: 第一步:找到需要修改的文件位置,查明原因 #.查看网络是否可以ping通 ~ ping www.baidu.com #.查 ...
- C1FlexGrid双grid滚动条联动
利用AfterScroll事件,来实现双grid联动. private void Grid_AfterScroll(object sender, RangeEventArgs e) { try { i ...
- python学习05条件分支
'''if '''a=1b=2if a==b: print(a)print(b) '''与C语言不同,python语言的if格式必须为if 布尔表达式:(冒号不能省略)其二,python有严格的缩进格 ...
- java 8 Streams简介
目录 简介 Functional Interface Function:一个参数一个返回值 BiFunction:接收两个参数,一个返回值 Supplier:无参的Function Consumer: ...
- 第八章服务器raid及配置实战
版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 总容量的一半 ...
- pod setup命令失败解决方法
最近运行pod setup出现以下问题: remote: Compressing objects: 100% (34/34), done.error: RPC failed; curl 56 SSLR ...
- HDU 1874 畅通工程续 2008浙大研究生复试热身赛(2)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- andorid jar/库源码解析之Bolts
目录:andorid jar/库源码解析 Bolts: 作用: 用于链式执行跨线程代码,且传递数据 栗子: Task.call(new Callable<Boolean>() { @Ove ...
- springboot rabbitmq 找不到队列
错误报告: org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to ...