JPA 增删改查类总

查询类别:

一二五:

面向对象的查法,用JPA底层提供的方法 (不需要写SQL,JPQL)
    JPA对方式一二提供的支持有限,只能实现一些简单的CRUD;如果要实现复杂的功能,则使用方式五
    方式五的思路,类似于mybatis逆向工程。设计理念:可以让不懂SQL的人,写出复杂的SQL语句

三四: 

自己需要写SQL,JPQL

jpa使用方式一:

  dao层中自己不用写任何方法,只调用父接口中的方法。
  缺点:父接口中提供的方法有限

jpa使用方式二:

可以编写自己的方法,并不写SQL。前提根据约定写方法名字

jpa使用方式三:

面向对象SQL语句:JPQL

  @Query("select p form People p where id=?1 and age=?2") 
  publish List findByIdAndAge(int id, int age);

方式三基础加分页功能:

  Pageable(PageRequest)

jpa使用方式四:

面向SQL(原生的SQL语句),推荐

原生sql增删改
 @Modifying
 @Query(nativeQuery=true, value="insert into tb_address(id,name) values(?,?) ")
  publish List addAddress(Integer id, String name);

 @Modifying
 @Query(nativeQuery=true, value="delete from tb_address where id=? ")
  publish List delAddress(Integer id);

 @Modifying
 @Query(nativeQuery=true, value="update tb_address a set a.name=? where a.id=?")
  publish List updateAddress(String name, Integer id);

原生sql查

 @Query(nativeQuery=true, value="select * from tb_people where name=? and age=?")
  publish List findByNameAndAge(string name, int age);

  @Query(nativeQuery=true, value="select * from tb_people where  age in (:ages)")
  publish List findByAges(@Param("ages") int age);
  :age 具名参数,说明是一个变量而不是普通的字段

方式四基础加分页功能:

Pageable(PageRequest)

jpa使用方式五:面向对象查法

方式五实现步骤:
    类似方式一,不用在dao中自定义任何方法(要写dao,只是不用写dao中的方法)
        如findAll(实现Specification接口)    使用Predicate构造查询条件
    实现service, controller

在动态查询Specifications有详细说明

动态查询:

QueryByExample  

    只能针对字符串开头/包含/结尾/正则的匹配
    不支持嵌套条件 ,如 or

Specifications

//条件分页查询
public R list(TGtSampleDto dto) {
        Page list = dao.findAll(new Specification() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                // 查询条件
                List predicates = new ArrayList<>();
                if(dto.getType() != null){ // 是否where子句中有id
                    predicates.add(criteriaBuilder.equal(root.get("type").as(Integer.class), dto.getType()));
                }
                if(dto.getRailwayBureau()!=null && dto.getRailwayBureau()!=""){ // 是否where子句中有railwayBureau
                    predicates.add(criteriaBuilder.like(root.get("railwayBureau").as(String.class), "%"+dto.getRailwayBureau()+"%"));
                }
                if(dto.getMinUploadTime()!=null){ // 是否where子句中有uploadTime
                    predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("uploadTime").as(LocalDateTime.class), dto.getMinUploadTime()));
                }
                if(dto.getMaxUploadTime()!=null){ // 是否where子句中有uploadTime
                    predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("uploadTime").as(LocalDateTime.class), dto.getMaxUploadTime()));
                }
                criteriaQuery.orderBy(criteriaBuilder.desc(root.get("uploadTime").as(Date.class)));

                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        }, PageRequest.of(dto.getCurrentPage(), dto.getSize()));
        return R.ok(list);
    }

Querydsl

    第三方通用查询框架

SQL小知识:

1.在使用group by时, select后的字段,要么是聚合函数,要么在group by后面

2.待更新

你可能感兴趣的:(数据库,sql,数据库)