一、使用方法

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查询的更多相关文章

  1. SpringBoot JPA实现增删改查、分页、排序、事务操作等功能

    今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能.下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and ...

  2. 用SpringBoot+MySql+JPA实现对数据库的增删改查和分页

    使用SpringBoot+Mysql+JPA实现对数据库的增删改查和分页      JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述 ...

  3. SpringBoot-Vue实现增删改查及分页小DEMO

    前言 主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo,实现增删改查.分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程. 开发栈 前端 开 ...

  4. Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码

    关于T4代码生成这块,我之前写过几篇帖子,如:<Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)>(http://www.cnblogs.co ...

  5. 一个Solr搜索实例,增删改查+高亮+分页

    今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...

  6. 自己写的一个Solr搜索实例,增删改查+高亮+分页

    今天个人coding的模块测试,所以闲暇之余继续研究solr,然后顺带写了一个实例,随便搞的,solr真心不熟,期待认识热爱搜索的朋友,共同进步. 1.配置schema.xml文件[solr\coll ...

  7. JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能

    一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...

  8. VS2012里面使用EF框架的增删改查和分页的方法

    public class BaseRepository<T> where T : class    {        //实例化EF框架        DataModelContainer ...

  9. 使用ListView+ObjectDataSource+DataPager实现增删改查加分页

    一.配置objectDataSource 选择业务逻辑层的类 二.配置Select对应的方法,必须是一个带两个整型参数的方法,第一个参数表示要查看的第一条记录的前一条30,第二个参数每页最多能显示的记 ...

随机推荐

  1. SUCTF 2019 Upload labs 2 踩坑记录

    SUCTF 2019 Upload labs 2 踩坑记录 题目地址 : https://github.com/team-su/SUCTF-2019/tree/master/Web/Upload La ...

  2. 数据库 MySQL 练习

    一.sql语句基础 1.顯示德國 Germany 的人口 SELECT population FROM world  WHERE name = 'Germany' 2.查詢面積為 5,000,000 ...

  3. springboot+dubbo简单分布式RPC调用demo

    使用springboot+dubbo搭建RPC入门案例 本文背景简述: 最近在学习公司的一套RPC框架,初步接触的时候感觉挺复杂的.但是知道其原理肯定是和dubbo很相似的,毕竟都是RPC框架嘛,只是 ...

  4. JavaScript--'data-'的用法(1)

    HTML5为我们提供了一个强大的功能,前段也也能实现后台数据库的效果,例如data-xxx <a href="#myModal" data-industry_id=" ...

  5. Zabbix CPU utilization监控参数

    工作中查看Zabbix linux 监控项的时候对linux 监控的cpu使用的各个参数没怎么明白,特意查看了下资料 Zabbix linux模板下的CPU utilization是自带的监控Linu ...

  6. 实用的linux 命令(上)

    今天介绍几个我常用的Linux 命令,每个命令这里只介绍其常用参数. 对于每个Linux 命令都可以使用man + 命令名称,查看其完整使用方法. 0,man man 命令是一个非常有用的命令,当你不 ...

  7. SpringBoot Mybatis-Plus 整合 dynamic-datasource-spring-boot-starter 对数据库进行读写分离

    准备工作 对 MySql 进行主从搭建 引入 dynamic-datasource-spring-boot-starter 坐标 引入 druid-spring-boot-starter 坐标 对应框 ...

  8. rabbitMQ安装docker版 /权限管理命令

    1.进入docker hub镜像仓库地址:https://hub.docker.com/ 2.搜素rabbitMQ 查询镜像,可以看到多种类型,选择带有web页面的(managment) 3.拉取镜像 ...

  9. SpringBoot内置生命周期事件详解 SpringBoot源码(十)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringBoot事件监听 ...

  10. 在okhttp的callback回调中加Toast出现Cant create handler inside hread that has not called Looper.prepare()...

    2019独角兽企业重金招聘Python工程师标准>>> 分析:callback中回调的response方法中还是在子线程中运行的,所以要调取Toast必须回到主线程中更新ui 解决方 ...