2019独角兽企业重金招聘Python工程师标准>>>
Cliff 发布于 9 个月前 0评论 2041浏览 javaspringjpa
我们在Spring Data JPA: 为所有Repository添加自定义方法中 学习了通过JpaRepositoryFactory来为所有Repository添加一个公共的方法以及实现。但在很多情况下,我们需要为某个单独的 Repository添加一个自定义的方法,并使其拥有一个自定义的实现。我们现在就来学习一下如何为某个单独的Repository添加自定义方法
定义Entry以及Repository
我们继续沿用之前Blog的例子,只需要一个基本的Entry对象以及Repositor即可:
@Entity
public class Blog {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String title;
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(length = 1024 * 1024)
private String content;
......
}
public interface BlogRepository extends JpaRepository {
}
自定义Repository接口
首先我们依然需要添加一个自定义的接口,该接口定义了我们自定义的方法,这里我们自定义一个searchTitle方法,表示通过某个key来搜索所有博客的title:
public interface CustomRepository {
List searchTitle(String key);
}
继承CustomRepository接口
然后,我们需要使BlogRepository
继承CustomRepository
:
public interface BlogRepository extends JpaRepository, CustomRepository {
}
实现CustomRepository接口
既然是自定义的方法,就需要我们自己去实现该方法。由于我们需要为BlogRepository
添加自定义方法,Spring Data Jpa会自动的去寻找类名为BlogRepositoryImpl
的类作为自定义方法的实现(如果有两个以上类名为BlogRepositoryImpl
的类,Spring Data Jpa会抛出错误):
public class BlogRepositoryImpl implements CustomRepository {
@PersistenceContext
private EntityManager em;
@Override
public List searchTitle(String key) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery(Blog.class);
Root root = query.from(Blog.class);
query.where(builder.like(root.get("title"), "%" + key + "%"));
return em.createQuery(query.select(root)).getResultList();
}
}
注:我们可以通过@EnableJpaRepositories(repositoryImplementationPostfix="Custom")来更改具体实现的后缀,我们这样设置后,相应的实现类应该为BlogRepositoryCustom
。
添加测试数据
为了方便测试,我们需要在应用启动的时候为数据库添加一些测试数据。这里我们利用@Component
和@PostConstruct
两个标注来实现。@Component
标注会使得应用启动时自动的实例化一个类型为DataInit
的Bean。@PostConstruct
使得该Bean实例化完成后自动的调用被标注的方法。这里我们仅仅添加一条数据用来测试:
@Component
public class DataInit {
private static final Logger logger = LoggerFactory.getLogger(DataInit.class);
@Autowired BlogRepository blogRepository;
@PostConstruct
public void dataInit(){
Blog blog = new Blog();
blog.setContent("this is blog content");
blog.setTitle("blog");
blog = blogRepository.save(blog);
logger.debug("id is {}", blog.getId());
}
}
测试
我们添加了一个TestController
进行测试。进入根目录,执行mvn spring-boot:run
可以运行我们的应用。
应用启动后,访问http://localhost:8080/search?key=blog
即可通过key值来查询对应的博客。
版权声明
本文由Cliff创作,转载需署名作者且注明文章出处
参考代码
要获取本文的参考代码,请访问: http://tianmaying.com/tutorial/spring-jpa-custom-single/repo
相关经验
- Spring Data Jpa 使用@Query标注自定义查询语句
- 部署Spring Boot应用
- Spring的自动装配方法
- Spring Data JPA: 为所有Repository添加自定义方法
- Spring处理自动装配歧义
- Spring Boot应用开发初探与示例
- 基于Spring提供支持不同设备的页面
- 基于Spring Boot为关系型数据库构建REST访问接口
- Spring处理表单提交
- 基于Spring的设备类型检查