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
userRepository.findById().orElseGet(null);//如果不存在,返回null userRepository.findById().orElseGet(User: read more
Spring-boot data JPA(二)增删改查
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
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
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);