Spring Data JPA-自定义实现

JPA-自定义实现

常用实现

在springdata JPA 的使用过程我们通常是通过在接口中定义方法,

public interface BookCurdRepository extends CrudRepository <Book, Long>{
	/**
	 * 通过书名查找书
	 * @param name
	 * @return
	 */
	Book findBookByName(String name);

}

其次复杂一点的就是通过@Query注解来实现

/**
	 * 更新名称和作者信息
	 * @param name
	 * @param author
	 * @param id
	 */
	@Transactional(rollbackFor = Exception.class)
	@Modifying
	@Query("update Book set name = ?1,author = ?2 where id = ?3")
	void updateNameAndAuthorById(String name,String author,long id);

自定义实现

在大多数的情况瞎,这两种方式是可以满足我们的需求,但是如果存在更加复杂的需要呢?可能在这个时候我们会吐槽没有mybaties那么灵活了,在Jpa中也可以实现的,我们可以通过自定义的方式来进行实现

1、创建自定义的接口

public interface BookCustomRepository {

	/**
	 * 查询所有书列表
	 * @return
	 */
	List<Book> listBook();
}

2、自定接口实现

@Repository
public class BookCustomRepositoryImpl implements BookCustomRepository {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Override
	public List<Book> listBook() {
	//在这里就可以自由发挥了,可以根据自己需求来实现
		String sql = "select * from book";
		BeanPropertyRowMapper<Book> rowMapper = new BeanPropertyRowMapper<>(Book.class);
		List<Book> bookList = jdbcTemplate.query(sql, rowMapper);
		return bookList;
	}
}

3、继承自定接口

/**
* @Description:    
* @Author:         JackQ
* @CreateDate:     2020/6/22 11:06
*/
@Repository
public interface BookRepository extends org.springframework.data.repository.Repository<Book,Long>, BookCustomRepository {

	/**
	 * 通过书名查找书
	 *
	 * @param name
	 * @return
	 */
	Book findBookByName(String name);

	/**
	 * 更新名称和作者信息
	 * @param name
	 * @param author
	 * @param id
	 */
	@Transactional(rollbackFor = Exception.class)
	@Modifying
	@Query("update Book set name = ?1,author = ?2 where id = ?3")
	void updateNameAndAuthorById(String name,String author,long id);

}

4、测试,在其他的地方就可以调用自定方法中的实现了

	@Test
	public void listBooks(){
		List<Book> books = bookService.listBooks();
		books.stream().forEach(book -> System.out.println(book.toString()));
	}
	//结果
	//Book(id=1, name=平凡的世界, price=30.2, author=路遥)
	//Book(id=2, name=人生, price=60.0, author=路遥)
	//Book(id=3, name=情书, price=38.0, author=岩井俊二)

自定义实现优先级别

在一个repository中可能存在继承多个接口,那么就可能存在相同的实现方法;自定义 implementations 的优先级高于基本 implementation 和 repository 方面。如果两个片段提供相同的方法签名,则此 ordering 允许您覆盖 base repository 和 aspect 方法并解决歧义。 Repository 片段不限于在单个 repository 接口中使用。多个 repositories 可以使用片段接口,让您可以跨不同的 repositories 重用自定义。

interface CustomizedSave<T> {
  <S extends T> S save(S entity);
}

class CustomizedSaveImpl<T> implements CustomizedSave<T> {

  public <S extends T> S save(S entity) {
    // Your custom implementation
  }
}

猜你喜欢

转载自www.cnblogs.com/JackQiang/p/13188414.html