Spring-boot data JPA(二)增删改查

less than 1 minute read

JPA的增删改查是无比简单的,它基于一个约定大于配置的逻辑。 加入我们要对User类进行查询,首先需要创建以下接口

    public interface UserRepository extends JpaRepository<User, Integer> {
    }

其中,User应该填写对应的实体类,Integer应该填写主键的类型。 JpaRepository提供了基础的方法,使用

    @Autowired
    private UserRepository userRepository;

注入后,就可以调用以下方法:

    userRepository.findById()//按照主键查找
    userRepository.findAll()//查找全部
    userRepository.save()//储存
    userRepository.saveAndFlush()//储存并重新读取
    userRepository.deleteById()//按照主键查询
    userRepository.deleteAll()//全部删除

更多方法请参照JPA文档。

其中,findById并不会直接返回一个User对象,由于查找结果可能为空,JPA选择返回一个Optional对象, 如果你需要一个User对象的话,可以这样写:

    userRepository.findById().orElseGet(null);//如果不存在,返回null
    userRepository.findById().orElseGet(User::new);//如果不存在,返回一个无参构造的对象

JPA支持自定义的方法,比如如果需要根据用户名查询用户,只需要在接口中实现:

    public interface UserRepository extends JpaRepository<User, Integer> {

      public Option<User> findByUsername(String username);
    }

其中Username必须要对应严格对应实体类中这一字段的名称,第一个字母要大写,其他原样复制。同样地,无需实现,这个方法就可以被调用。 当然,由于JPA过于智能,这个方法可以被写成:

      public Option<User> findByUsername(String username);

从而直接返回一个对象。 **强烈推荐使用第一种写法,即返回Option的写法,这种写法支持程序员自定义查值失败时的处理方式。** JPQL中还存在丰富的关键字: And,Or用于连接条件,如

      public Option<User> findByUsernameAndId(String username, Integer id);

Is, Equals, Between, LessThan, LessThanEqual, GreaterThan, GreaterThanEqual, After, Before用于比较大小,其中After,Before适用于日期; IsNull, IsNotNull, NotNull用于判断是否为空; Like, NotLike, StartingWith, EndingWith, Containing适用于字符串; 可以组合出这样的查询:

      public List<User> findByUsernameLikeAndIdGreaterThan(String username, Integer id);

In关键字等同于sql中的in,需要注意的是参数需要为Collection<>:

      public List<User> findByIdIn(Collection<>);

Not相当于不等号, NotIn意味着不包含; 而True,False则是专门为boolean类准备的; IgnoreCase则是无视大小写;

          public List<User> findByUsernameIgnoreCase(String username);//查询相等
          public List<User> findByUsernameNotIgnoreCase(String username);//查询不等

将每个被And连接的字段视为一个整体,一个整体中一般只含有一个关键字(或者包含Not在内的两个关键字); 对于更复杂的查询,可以自定义:

          @Query("SELECT u FROM USER u WHERE u.ID == %?1% ")
          public List<User> findByUserName(@Param("username") String username);
荆凉凉

荆凉凉

在校大学生.