SpringData专题-JPA中的复杂查询

Posted 熊猫IT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringData专题-JPA中的复杂查询相关的知识,希望对你有一定的参考价值。

JPQL全称Java Persistence Query Language
基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名属性访问,而不是表名和表的属性。

Hibernate框架查询语言: HQL

JPA查询语言: JPQL

1.抽取JPAUtil工具类

/**
* @author bruceliu
* @create 2019-07-30 14:10
* @description JPA的工具类(事务处理没有封装好)
*/
public class JPAUtil

private static EntityManagerFactory factory=null;

static
factory = Persistence.createEntityManagerFactory("myJpa");


/**
* 获取EntityManager
* @return
*/
public static EntityManager getEntityManager()
return factory.createEntityManager();


/**
* 关闭资源
* @param factory
* @param em
*/
public static void clodeResources(EntityManagerFactory factory,EntityManager em)
em.close();
factory.close();

###2.查询全部

//查询所有客户
@Test
public void findAll()
EntityManager em = null;
EntityTransaction tx = null;
try
//获取实体管理对象
em = JPAUtil.getEntityManager();
//获取事务对象
tx = em.getTransaction();
tx.begin();
// 创建query对象
String jpql = "from Customer";
Query query = em.createQuery(jpql);
// 查询并得到返回结果
List list = query.getResultList(); // 得到集合返回类型
for (Object object : list)
System.out.println(object);

tx.commit();
catch (Exception e)
// 回滚事务
tx.rollback();
e.printStackTrace();
finally
// 释放资源
em.close();

3.分页查询

/**
* 测试分页查询
*/
@Test
public void testPage()
EntityManager em = JPAUtil.getEntityManager();

Query query = em.createQuery("select count(id) from Customer");
Integer totalCount = Integer.parseInt(query.getSingleResult().toString()); //查询一个结果
System.out.println("数据库的总数是:"+totalCount);

int pageIndex=4;
int pageSize=3;
int pageCount=totalCount%pageSize==0?(totalCount/pageSize):(totalCount/pageSize+1);

Query query1 = em.createQuery("from Customer ");
query1.setFirstResult((pageIndex-1)*pageSize);//设置开始查询的位置
query1.setMaxResults(pageSize); //设置每页查询的大小

System.out.println("当前页码:"+pageIndex);
System.out.println("每页大小:"+pageSize);
System.out.println("总页数:"+pageCount);
System.out.println("总条数:"+totalCount);

List<Customer> list = query1.getResultList();
for (Customer customer : list)
System.out.println(customer);

4.条件查询

/**
* 条件查询
* 假设需要查询 年龄大于等于18 并小于等于40
*/
@Test
public void testQuery1()
EntityManager em = JPAUtil.getEntityManager();

Query query = em.createQuery("from Customer where age>=? and age<=?");//JPSQL语句 此处非SQL语句!
query.setParameter(1,18);
query.setParameter(2,40);

List<Customer> list = query.getResultList();
for (Customer customer : list)
System.out.println(customer);

JPAUtil.clodeResources(em);


/**
* 条件查询
* 假设需要查询 年龄大于等于18 并小于等于40
* 按照下标占位
*/
@Test
public void testQuery2()
EntityManager em = JPAUtil.getEntityManager();

Query query = em.createQuery("from Customer where age>=?1 and age<=?2");//JPSQL语句 此处非SQL语句!
query.setParameter(1,18);
query.setParameter(2,40);

List<Customer> list = query.getResultList();
for (Customer customer : list)
System.out.println(customer);

JPAUtil.clodeResources(em);


/**
* 条件查询
* 假设需要查询 年龄大于等于18 并小于等于40
* 按照位置占位符
*/
@Test
public void testQuery3()
EntityManager em springdata-jpa 八种查询方法

SpringData JPA多表查询

springdata jpa快速构建RESTful

SpringData JPA多表关联操作

jpa pagingandsortingrepository啥情况会过滤条件查询

使用 Spring Data 进行复杂查询