springdataJPA的使用

参考:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.namespace

https://blog.csdn.net/hbtj_1216/article/details/79773839

介意idea装个jpa buddy插件

CrudRepository<T, ID>提供的方法

/**
 * 保存一个实体。
 */
<S extends T> S save(S entity);

/**
 * 保存提供的所有实体。
 */
<S extends T> Iterable<S> saveAll(Iterable<S> entities);

/**
 * 根据id查询对应的实体。
 */
Optional<T> findById(ID id);

/**
 * 根据id查询对应的实体是否存在。
 */
boolean existsById(ID id);

/**
 * 查询所有的实体。
 */
Iterable<T> findAll();

/**
 * 根据给定的id集合查询所有对应的实体,返回实体集合。
 */
Iterable<T> findAllById(Iterable<ID> ids);

/**
 * 统计现存实体的个数。
 */
long count();

/**
 * 根据id删除对应的实体。
 */
void deleteById(ID id);

/**
 * 删除给定的实体。
 */
void delete(T entity);

/**
 * 删除给定的实体集合。
 */
void deleteAll(Iterable<? extends T> entities);

/**
 * 删除所有的实体。
 */
void deleteAll();

PagingAndSortingRepository<T, ID>提供的方法

具备分页和排序的方法:

/**
 * 返回所有的实体,根据Sort参数提供的规则排序。
 */
Iterable<T> findAll(Sort sort);

/**
 * 返回一页实体,根据Pageable参数提供的规则进行过滤。
 */
Page<T> findAll(Pageable pageable);

JpaRepository<T, ID>提供的方法

/**
 * 将所有未决的更改刷新到数据库。
 */
void flush();

/**
 * 保存一个实体并立即将更改刷新到数据库。
 */
<S extends T> S saveAndFlush(S entity);

/**
 * 在一个批次中删除给定的实体集合,这意味着将产生一条单独的Query。
 */
void deleteInBatch(Iterable<T> entities);

/**
 * 在一个批次中删除所有的实体。
 */
void deleteAllInBatch();

/**
 * 根据给定的id标识符,返回对应实体的引用。
 */
T getOne(ID id);
package com.acme.repositories;

import com.jpa.entity.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;

//public interface UserRepository extends CrudRepository<User,Long> {//增删改查内置方法
public interface UserRepository extends PagingAndSortingRepository<User,Long> {//PagingAndSortingRepository具备分页和排序

}
package com.jpa;

import com.acme.repositories.UserRepository;
import com.jpa.config.SpringDataJPAConfig;
import com.jpa.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.print.attribute.standard.PageRanges;
import java.util.Optional;

//基于junit4 spring单元测试
//@ContextConfiguration(locations = "/spring.xml")//xml文件配置
@ContextConfiguration(classes = SpringDataJPAConfig.class)//config类配置
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringDataJpaPagingAndSortTest {

    @Autowired
    UserRepository repository;

    @Test
    public void test_get(){

        Page<User> all = repository.findAll(PageRequest.of(0,2));
        System.out.println(all);
        System.out.println("total==="+all.getTotalPages());
        System.out.println("ele==="+all.getTotalElements());
        System.out.println("content==="+all.getContent());

    }

    @Test
    public void test_get02(){

        Sort sort = Sort.by("id").descending();

        Page<User> all = repository.findAll(PageRequest.of(0,2,sort));
        System.out.println(all);
        System.out.println("total==="+all.getTotalPages());
        System.out.println("ele==="+all.getTotalElements());
        System.out.println("content==="+all.getContent());

    }

    /*
    * https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.namespace
    * */
    @Test
    public void test_get_sortTypeSafe(){

        Sort.TypedSort<User> user = Sort.sort(User.class);

        Sort sort = user.by(User::getId).ascending();
        Page<User> all = repository.findAll(PageRequest.of(0,2,sort));
        System.out.println(all);
        System.out.println("total==="+all.getTotalPages());
        System.out.println("ele==="+all.getTotalElements());
        System.out.println("content==="+all.getContent());


    }

}

自定义操作–sql

**1、jpql(原生sql)
a.@Query
i.查询如果返回单个实体就用pojo接收,如果是多个需要通过集合
ii.参数设置方式
1.索引:?数字
2.具名: :参数名 结合@Param注解指定参数名字
iii.增删改:
1.要加上事务的支持:
2.如果是插入方法:一定只能在hibernate下才支持(inset into …select)
**

        @Modifying//通知springdatajpa 是增删改的操作
		@Transactional//通常会放在业务逻辑层声明

原生sql:

@Query(value = "select * from t_user where username =:userName"
    ,nativeQuery = true)
    List<User> findUserByUserNameBySql(@Param("userName") String userName);

代码:

package com.acme.repositories;

import com.jpa.entity.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

//public interface UserRepository extends CrudRepository<User,Long> {//增删改查内置方法
public interface UserRepository extends PagingAndSortingRepository<User,Long> {//PagingAndSortingRepository具备分页和排序

//    增删查改

//    查询
//    @Query("from User where username =?1")
//    List<User> findUserByUserName(String userName);

    //    查询---通过具名参数
    @Query("from User where username =:userName")
    List<User> findUserByUserName(@Param("userName") String userName);

//    修改
    @Query("update User u set u.username=:userName where u.id =:id")
    @Modifying//通知springdatajpa 是增删改的操作
    @Transactional
    int updateUserById(@Param("userName")String userName,@Param("id")Long id);

//    删除
    @Modifying//通知springdatajpa 是增删改的操作
    @Transactional
    @Query("delete from User u where u.id =?1")
    int deleteUserById(Long id);

//    新增  jpql(hibernate支持伪新增)
    @Modifying//通知springdatajpa 是增删改的操作
    @Transactional
    @Query("insert into User (username) select u.username from User u where u.id =?1")
    int insertUserBySelect(Long id);

    /*------------原生sql-------------*/
    //    查询---通过具名参数
    @Query(value = "select * from t_user where username =:userName"
    ,nativeQuery = true)
    List<User> findUserByUserNameBySql(@Param("userName") String userName);


}
package com.jpa;

import com.acme.repositories.UserRepository;
import com.jpa.config.SpringDataJPAConfig;
import com.jpa.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;
import java.util.List;
import java.util.Optional;

//基于junit4 spring单元测试
//@ContextConfiguration(locations = "/spring.xml")//xml文件配置
@ContextConfiguration(classes = SpringDataJPAConfig.class)//config类配置
@RunWith(SpringJUnit4ClassRunner.class)
public class JpqlTest {

    @Autowired
    UserRepository repository;

    @Test
    public void test_get(){

        List<User> admin = repository.findUserByUserName("jpa");
        System.out.println(admin);

    }

    @Test
    public void test_update(){

        int res = repository.updateUserById("小小", 5l);
        System.out.println(res);

    }

    @Test
    public void test_delete(){

        int res = repository.deleteUserById(5l);
        System.out.println(res);

    }

    @Test
    public void test_add(){

        int res = repository.insertUserBySelect(2l);
        System.out.println(res);

    }

    @Test
    public void test_sql_select(){

        List<User> userByUserNameBySql = repository.findUserByUserNameBySql("jpa");
        System.out.println(userByUserNameBySql);

    }


}

自定义操作–规范方法名

官网:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
主题关键字:决定当前方法作用

在这里插入图片描述

谓词关键字和修饰符:决定查询条件

代码演示:

package com.acme.repositories;

import com.jpa.entity.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

//public interface UserRepository extends CrudRepository<User,Long> {//增删改查内置方法
public interface UserMethodNameRepository extends PagingAndSortingRepository<User,Long> {//PagingAndSortingRepository具备分页和排序

    List<User> findByUsername(String username);

    boolean existsByUsername(String username);

    @Transactional
    @Modifying
    int deleteByUsernameAndId(String username,Long id);

    List<User> findByUsernameLike(String username);

}
package com.jpa;

import com.acme.repositories.UserMethodNameRepository;
import com.acme.repositories.UserRepository;
import com.jpa.config.SpringDataJPAConfig;
import com.jpa.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

//基于junit4 spring单元测试
//@ContextConfiguration(locations = "/spring.xml")//xml文件配置
@ContextConfiguration(classes = SpringDataJPAConfig.class)//config类配置
@RunWith(SpringJUnit4ClassRunner.class)
public class MethodNameTest {

    @Autowired
    UserMethodNameRepository repository;

    @Test
    public void test_get(){

        List<User> admin = repository.findByUsername("jpa");
        System.out.println(admin);

    }

    @Test
    public void test_get02(){

        boolean jpa = repository.existsByUsername("jpa");
        System.out.println(jpa);

    }


    @Test
    public void test_get03(){

        int jpa = repository.deleteByUsernameAndId("jpa",8l);
        System.out.println(jpa);

    }

    @Test
    public void test_get04(){

        List<User> byUsernameLike = repository.findByUsernameLike("jp%");
        System.out.println(byUsernameLike);

    }
}

自定义操作–Query by Example(动态条件查询)

Query by Example a.只支持查询
i.不支持嵌套或分组的属性约束,如firstname = ? 0 或(firstname =? 1 and lastname =? 2).
ii.只支持字符串 start/contains/ends/refex匹配和其他属性类型的精确匹配

代码演示:

package com.acme.repositories;

import com.jpa.entity.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

import javax.transaction.Transactional;
import java.util.List;

public interface UserQBEeRepository extends PagingAndSortingRepository<User,Long>
        , QueryByExampleExecutor<User> {//PagingAndSortingRepository具备分页和排序



}
package com.jpa;

import com.acme.repositories.UserQBEeRepository;
import com.acme.repositories.UserRepository;
import com.jpa.config.SpringDataJPAConfig;
import com.jpa.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

//基于junit4 spring单元测试
//@ContextConfiguration(locations = "/spring.xml")//xml文件配置
@ContextConfiguration(classes = SpringDataJPAConfig.class)//config类配置
@RunWith(SpringJUnit4ClassRunner.class)
public class QBETest {

    @Autowired
    UserQBEeRepository repository;

    /*
    * 简单实例  客户名称 客户地址动态查询
    * */
    @Test
    public void test_get(){

        User user = new User();
        user.setUsername("jpa");
        user.setRoleName("admin");

//        通过example构建查询条件
        Example<User> of = Example.of(user);

        List<User> admin = (List<User>) repository.findAll(of);
        System.out.println(admin);

    }

    /*
    通过匹配器进行条件的限制:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.matchers
     * 简单实例  客户名称 客户地址动态查询
     * */
    @Test
    public void test_get02(){

        User user = new User();
        user.setUsername("admin");
        user.setRoleName("in");

//        通过匹配器对条件行为进行设置
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withIgnorePaths("username")//设置忽略属性
//                .withIgnoreCase("roleName")//设置忽略大小写
//                .withStringMatcher(ExampleMatcher.StringMatcher.ENDING);//对所有条件进行模糊匹配
//                .withMatcher("roleName",m -> m.endsWith());//针对单个条件进行匹配,会使withIgnoreCase失效,需要单独设置
                .withMatcher("roleName",ExampleMatcher.GenericPropertyMatchers.endsWith().ignoreCase());

//        通过example构建查询条件
        Example<User> of = Example.of(user,matcher);

        List<User> admin = (List<User>) repository.findAll(of);
        System.out.println(admin);

    }


}

自定义操作–QueryDSL(动态条件查询)推荐

queryDSL是基于ORM框架或sql平台上的一个通用查询框架。借助QueryDSL可以在任何支持的ORM框架或SQL平台上通用的API方式构建查询。
JPA是QueryDSL的主要集成技术,是JPQL和Criteria查询的代替方法。目前QueryDSL支持的平台包括JPA,JDO,SQL,Mongodb等等。。。

官网:http://querydsl.com/
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.extensions.querydsl

添加querydsl插件生成q类:

https://github.com/querydsl/querydsl/tree/master/querydsl-jpa

 <build>
        <plugins>
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/queries</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.querydsl</groupId>
                        <artifactId>querydsl-apt</artifactId>
                        <version>${querydsl.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

添加好meaven插件后,进行生成q类:
target/generated-sources/queries
当编译完后,就会往target/generated-sources/queries这个文件夹中生成q类

在这里插入图片描述
在这里插入图片描述
将这个queries设置为idea中的source文件夹(代码文件夹,正常编码文件夹:source)

在这里插入图片描述

代码:

package com.acme.repositories;

import com.jpa.entity.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;

import javax.transaction.Transactional;
import java.util.List;

//https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.extensions.querydsl
//public interface UserRepository extends CrudRepository<User,Long> {//增删改查内置方法
public interface UserQueryDSLRepository extends
        PagingAndSortingRepository<User,Long>
        , QuerydslPredicateExecutor<User> {//PagingAndSortingRepository具备分页和排序



}
package com.jpa;

import com.acme.repositories.UserMethodNameRepository;
import com.acme.repositories.UserQueryDSLRepository;
import com.jpa.config.SpringDataJPAConfig;
import com.jpa.entity.QUser;
import com.jpa.entity.User;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.StringUtils;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

//基于junit4 spring单元测试
//@ContextConfiguration(locations = "/spring.xml")//xml文件配置
@ContextConfiguration(classes = SpringDataJPAConfig.class)//config类配置
@RunWith(SpringJUnit4ClassRunner.class)
public class QueryDSLTest {

    @Autowired
    UserQueryDSLRepository repository;

    @Test
    public void test_get(){

        QUser user = QUser.user;

//        通过id查找
        BooleanExpression eq = user.id.eq(1l);

        System.out.println(repository.findOne(eq));


    }

    /*
    * 查询客户名称范围(in)
    * id  >大于
    * 地址  精确
    *
    * */
    @Test
    public void test_get02(){

        QUser user = QUser.user;

//        通过id查找
        BooleanExpression and = user.username.in("admin", "jpa")
                .and(user.id.gt(0l))
                .and(user.roleName.eq("Admin"));

        System.out.println(repository.findAll(and));


    }


    @Test
    public void test_get03(){

        User user = new User();
        user.setUsername("admin");
        user.setId(0l).setRoleName("admin").setRole(0l);

        QUser qUser = QUser.user;
//      初始条件  类似1==1  永远都成立的条件
        BooleanExpression exp = qUser.isNotNull().or(qUser.isNull());

        exp = user.getId() > -1 ?exp.and(qUser.id.gt(user.getId()))  : exp;

        exp =  !StringUtils.isEmpty(user.getUsername())? exp.and(qUser.username.in(user.getUsername().split(","))) : exp;
        exp =  !StringUtils.isEmpty(user.getRoleName())? exp.and(qUser.roleName.eq(user.getRoleName())) : exp;


        System.out.println(repository.findAll(exp));


    }

//  线程安全问题(@Autowired:单列),解决:@PersistenceContext
    @PersistenceContext
    EntityManager em;

    /*
    * 列查询、分组
    *
    * 原生态
    * */
    @Test
    public void test_get04(){

        JPAQueryFactory factory = new JPAQueryFactory(em);
        QUser qUser = QUser.user;

//        select id,username from
//        构建基于QueryDSL的查询
//        返回值类型是根据你查询的数据自动选择类型的
        JPAQuery<Tuple> tupleJPAQuery = factory.select(qUser.id, qUser.username)
                .from(qUser)
                .where(qUser.id.eq(1l))
                .orderBy(qUser.id.desc());
//      执行查询
        List<Tuple> fetch = tupleJPAQuery.fetch();

//        处理返回数据
        for (Tuple tuple : fetch) {

            System.out.println(tuple.get(qUser.id));
            System.out.println(tuple.get(qUser.username));

        }

/*------------------------------2------------------------------------*/
        //        返回值类型是根据你查询的数据自动选择类型的
        JPAQuery<Long> longJPAQuery = factory.select(qUser.id.sum())
                .from(qUser)
//                .where(qUser.id.eq(1l))
                .orderBy(qUser.id.desc());
//      执行查询
        List<Long> longFetct = longJPAQuery.fetch();

//        处理返回数据
        for (Long tuple : longFetct) {

            System.out.println(tuple);

        }



    }


}

自定义操作–Specifications

限制:不能分组、聚合函数,需要自己通过entityManager玩
在之前使用Query by Example只能针对字符串进行条件设置,那如果希望所有类型支持,可以使用Specifications

代码:

package com.acme.repositories;

import com.jpa.entity.User;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

//public interface UserRepository extends CrudRepository<User,Long> {//增删改查内置方法
public interface UserSepcificationsRepository extends
        PagingAndSortingRepository<User,Long> ,
        JpaSpecificationExecutor<User> {//PagingAndSortingRepository具备分页和排序




}
package com.jpa;

import com.acme.repositories.UserQueryDSLRepository;
import com.acme.repositories.UserSepcificationsRepository;
import com.alibaba.druid.util.StringUtils;
import com.jpa.config.SpringDataJPAConfig;
import com.jpa.entity.QUser;
import com.jpa.entity.User;
import com.querydsl.core.types.dsl.BooleanExpression;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.persistence.EntityManager;
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;

//基于junit4 spring单元测试
//@ContextConfiguration(locations = "/spring.xml")//xml文件配置
@ContextConfiguration(classes = SpringDataJPAConfig.class)//config类配置
@RunWith(SpringJUnit4ClassRunner.class)
public class SpecificationTest {

    @Autowired
    UserSepcificationsRepository repository;

    @Autowired
    EntityManager entityManager;

    /*
     * 查询客户范围(in)
     * id >大于
     * 地址  精确
     *
     * */
    @Test
    public void test_get(){

        List<User> all = repository.findAll(new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//                root  form User,获取列
//                criteriaBuilder where  设置各种条件  (> < in ..)
//                query 组合(order by,where)
                Path<Long> id = root.get("id");
                Path<String> username = root.get("username");
                Path<String> roleName = root.get("roleName");
//              参数1:为哪个字段设置条件  参数2:值
                Predicate admin = criteriaBuilder.equal(roleName, "admin");
                Predicate id0 = criteriaBuilder.greaterThan(id, 0l);
                CriteriaBuilder.In<String> in = criteriaBuilder.in(roleName);
                in.value("admin").value("ADMIN");

                Predicate and = criteriaBuilder.and(admin, id0,in);

                return and;
            }
        });

        System.out.println(all);
    }

    @Test
    public void test_get02(){

        User user = new User();
        user.setUsername("admin");
        user.setId(0l).setRoleName("admin").setRole(0l);

        List<User> all = repository.findAll(new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//                root  form User,获取列
//                criteriaBuilder where  设置各种条件  (> < in ..)
//                query 组合(order by,where)
                Path<Long> id = root.get("id");
                Path<String> username = root.get("username");
                Path<String> roleName = root.get("roleName");

//              参数1:为哪个字段设置条件  参数2:值
                List<Predicate> list = new ArrayList<>();
                if(!StringUtils.isEmpty(user.getUsername())){
                    list.add(criteriaBuilder.equal(roleName, "admin"));
                }
                if(user.getRole() > -1){
                    list.add(criteriaBuilder.greaterThan(id, 0l));
                }
                if(!StringUtils.isEmpty(user.getRoleName())){
                    CriteriaBuilder.In<String> in = criteriaBuilder.in(roleName);
                    in.value("admin").value("ADMIN");
                    list.add(in);
                }


                Predicate and = criteriaBuilder.and(list.toArray(new Predicate[list.size()]));

                return and;
            }
        });

        System.out.println(all);
    }


    @Test
    public void test_get03(){

        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Object> query = criteriaBuilder.createQuery();
        Root<User> from = query.from(User.class);



        User user = new User();
        user.setUsername("admin");
        user.setId(0l).setRoleName("admin").setRole(0l);

        List<User> all = repository.findAll(new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//                root  form User,获取列
//                criteriaBuilder where  设置各种条件  (> < in ..)
//                query 组合(order by,where)
//                1、通过root拿到需要设置条件的字段
                Path<Long> id = root.get("id");
                Path<String> username = root.get("username");
                Path<String> roleName = root.get("roleName");

//              参数1:为哪个字段设置条件  参数2:值
//                2、设置不同类型的条件
                List<Predicate> list = new ArrayList<>();
                if(!StringUtils.isEmpty(user.getUsername())){
                    list.add(criteriaBuilder.equal(roleName, "admin"));
                }
                if(user.getRole() > -1){
                    list.add(criteriaBuilder.greaterThan(id, 0l));
                }
                if(!StringUtils.isEmpty(user.getRoleName())){
                    CriteriaBuilder.In<String> in = criteriaBuilder.in(roleName);
                    in.value("admin").value("ADMIN");
                    list.add(in);
                }

            //  组合条件
                Predicate and = criteriaBuilder.and(list.toArray(new Predicate[list.size()]));

                Order desc = criteriaBuilder.desc(id);
                return criteriaQuery.where(and).orderBy(desc).getGroupRestriction();
            }
        });

        System.out.println(all);
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data JPA 是一个用于简化数据库访问的框架,它基于 JPA (Java Persistence API) 规范,提供了一种更简单、更高效的方式来访问和操作数据库。 下面是使用 Spring Data JPA 的一般步骤: 1. 添加依赖:在你的项目中,添加 Spring Data JPA 的依赖。你可以在 Maven 或 Gradle 配置文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据库连接:在 `application.properties` 或 `application.yml` 文件中配置数据库连接信息,包括数据库 URL、用户名、密码等。 3. 创建实体类:创建与数据库表对应的实体类,并使用 JPA 注解来映射实体类与数据库表之间的关系。 ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // getters and setters } ``` 4. 创建 Repository 接口:创建一个继承自 `JpaRepository` 的接口,并通过方法命名规则或自定义查询方法来定义数据库操作。 ```java public interface UserRepository extends JpaRepository<User, Long> { List<User> findByAgeGreaterThan(Integer age); } ``` 5. 使用 Repository:在需要访问数据库的地方,注入 Repository 接口,并调用其中的方法进行数据库操作。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByAgeGreaterThan(Integer age) { return userRepository.findByAgeGreaterThan(age); } } ``` 这只是 Spring Data JPA 的基本用法,你还可以使用更高级的特性,如分页、排序、复杂查询等。希望这些信息对你有帮助!如果你有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值