@NotNull
(message =
"参数不允许为空"
)
private
Integer page =
1
;
@NotNull
(message =
"参数不允许为空"
)
private
Integer size =
20
;
-
进行封装 PageBean .
import java.util.List;
public class PageBean<T> {
private Long totalCount;
private List<T> pageData;
public Long getTotalCount() {
return totalCount;
public void setTotalCount(Long totalCount) {
this.totalCount = totalCount;
public List<T> getPageData() {
return pageData;
public void setPageData(List<T> pageData) {
this.pageData = pageData;
进行封装自己的查询参数:这个就不再多说了 。
SpingMVC controller
@RequestMapping("/vehicleAndTerminal.json")
@ResponseBody
public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal){
return terminalService.vehicleAndTerminal(pageQuery, terminal);
- 进行业务层代码 :
5.1 注入entityManagerFactory
@Autowired
private LocalContainerEntityManagerFactoryBean entityManagerFactory;
5.2 进行原生的Sql 拼接
@Override
public HashMap<String, Object> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal) {
HashMap<String, Object> map = new HashMap<String, Object>();
String sql = "SELECT * FROM terminal t WHERE t.vSn IS NOT NULL AND t.vSn!=''";
Integer page = pageQuery.getPage();
Integer size = pageQuery.getSize();
String vSn = terminal.getvSn();
if (vSn != null) {
sql += "AND t.vSn=" + vSn + " ";
String vin = terminal.getVin();
if (vin != null) {
sql += "AND t.vin=" + vin + " ";
String num = terminal.getNum();
if (num != null) {
sql += "AND t.num=" + num + " ";
String barcode = terminal.getBarcode();
if (barcode != null) {
sql += "AND t.barcode=" + barcode + " ";
sql += "LIMIT" + " " + page + "," + size;
EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
Query nativeQuery = em.createNativeQuery(sql, Terminal.class);
@SuppressWarnings({ "unused", "unchecked" })
List<Terminal> termins = nativeQuery.getResultList();
if (em != null) {
em.close();
map.put("total", termins.size());
map.put("rows", termins);
return map;
这样就实现了动态查询 ,以及分页。 上面的代码 我自己封装的PageBean 没有用上 ,下面的代码是改过的
public PageBean<Terminal> vehicleAndTerminal(PageQuery pageQuery, Terminal terminal) {
HashMap<String, Object> map = new HashMap<String, Object>();
String sql = "SELECT * FROM terminal t WHERE t.vSn IS NOT NULL AND t.vSn!=''";
Integer page = pageQuery.getPage();
Integer size = pageQuery.getSize();
String vSn = terminal.getvSn();
if (vSn != null) {
sql += "AND t.vSn=" + vSn + " ";
String vin = terminal.getVin();
if (vin != null) {
sql += "AND t.vin=" + vin + " ";
String num = terminal.getNum();
if (num != null) {
sql += "AND t.num=" + num + " ";
String barcode = terminal.getBarcode();
if (barcode != null) {
sql += "AND t.barcode=" + barcode + " ";
sql += "LIMIT" + " " + page + "," + size;
EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
Query nativeQuery = em.createNativeQuery(sql, Terminal.class);
@SuppressWarnings({ "unused", "unchecked" })
List<Terminal> termins = nativeQuery.getResultList();
if (em != null) {
em.close();
PageBean<Terminal> pageBean = new PageBean<>();
pageBean.setTotalCount((long) termins.size());
pageBean.setPageData(termins);
return pageBean;
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocatio...
1:首先需要判定传入的值是否存在,且不为空2:时间类型为between and,需保证两个时间都不为空3:JPA支持in equal like between and4:reposotory层需继承JpaRepository,JpaSpecificationExecutor。
概述ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式。环境springBootIDEA2017.3.4JDK8pom.xml4.0.0org.springframework.bootspring-boot-starter-parent2.1.6.RELEASEcom.xmlx...
public List<OrgCustomize> findByNameLike(String name, String customerId,Integer type) {
StringBuilder sb = new StringBuilder();
StringBuilder condition = new StringBuilder();
sb.append("select e.* from org_customize e ...
public List<ITAssets> listByWhere(Map<String,Object> map,Integer pageIndex, Integer pageSize) {//通过map传递查询条件
StringBuilder sql = new StringBuilder();
sql.append("select * from t_a_i..
1.什么是JPQL
JPQL全称Java Persistence Query Language
ava持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式
jpql和sql是类似的,和sql有区别不能出现*
2.jpql原则属性的规则
(1).在jpql不能出现*,不能出现表名,只能出现对象别名,或...
在使用JPA的@Query注解写原生sql语句的时候,如果查询条件中有in且需要传参的话,记得向里传一个List,不能传字符串。
如果传字符串,那么实际执行的语句是select * from Student s where s.id in(‘1,2,3’),而不是select * from Student s where s.id in(1,2,3)。
注意注意。
最近在对JPA的使用过程中发现对于单表的操作很是方便,但是当设计到多表联查的时候就需要有一些特殊的操作了。
项目中有一个场景是后台需要做一个分页的列表查询,所需要的数据分散在两张表中,如果是用mybatis的话直接定义resultMap,然后手写SQL就可以了。而在JPA中就需要用到JPQL了。
首先定义一下各个对象之间的关系
实体 GxOrderDO :订单。
实体 GxOrderDet...
private @Autowired EntityManager em;
//private @PersistenceContext EntityManager defaultEm;
@SuppressWarnings("unchecked")
public List<Book> findByName1(String bookName, String expressName) {
SpringDataJpa
Spring Data JPA是较大的Spring Data系列的一部分,可轻松实现基于JPA的存储库。该模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring支持的应用程序变得更加容易。
实现应用程序的数据访问层已经很长一段时间了。为了执行简单查询以及执行分页和审核,必须编写太多样板代码。Spring Data JPA旨在通过将工作量减少...
String sql = "select count(1),\n" +
"sum(case finish_time when 0 then 1 else 0 end),\n" +
"sum(case finish_time when 0 then 0 else 1 end),\n" +
"merchant_id,\n" +
"store...