前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring data jpa 单独定义jpaRespoistory方法

spring data jpa 单独定义jpaRespoistory方法

作者头像
用户1499526
发布2019-07-15 17:39:05
1.2K0
发布2019-07-15 17:39:05
举报
文章被收录于专栏:简单的日记简单的日记

我们在Spring Data JPA: 为所有Repository添加自定义方法中学习了通过JpaRepositoryFactory来为所有Repository添加一个公共的方法以及实现。但在很多情况下,我们需要为某个单独的Repository添加一个自定义的方法,并使其拥有一个自定义的实现。我们现在就来学习一下如何为某个单独的Repository添加自定义方法

定义Entry以及Repository

我们继续沿用之前Blog的例子,只需要一个基本的Entry对象以及Repositor即可:

代码语言:javascript
复制
@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;
    ......

}
代码语言:javascript
复制
public interface BlogRepository extends JpaRepository<Blog, Integer> {
}

自定义Repository接口

首先我们依然需要添加一个自定义的接口,该接口定义了我们自定义的方法,这里我们自定义一个searchTitle方法,表示通过某个key来搜索所有博客的title:

代码语言:javascript
复制
public interface CustomRepository {
    
    List<Blog> searchTitle(String key);

}

继承CustomRepository接口

然后,我们需要使BlogRepository继承CustomRepository

代码语言:javascript
复制
public interface BlogRepository extends JpaRepository<Blog, Integer>, CustomRepository {
}

实现CustomRepository接口

既然是自定义的方法,就需要我们自己去实现该方法。由于我们需要为BlogRepository添加自定义方法,Spring Data Jpa会自动的去寻找类名为BlogRepositoryImpl的类作为自定义方法的实现(如果有两个以上类名为BlogRepositoryImpl的类,Spring Data Jpa会抛出错误):

代码语言:javascript
复制
public class BlogRepositoryImpl implements CustomRepository {
    
    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Blog> searchTitle(String key) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Blog> query = builder.createQuery(Blog.class);
        Root<Blog> 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实例化完成后自动的调用被标注的方法。这里我们仅仅添加一条数据用来测试:

代码语言:javascript
复制
@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值来查询对应的博客。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义Entry以及Repository
  • 自定义Repository接口
  • 继承CustomRepository接口
  • 实现CustomRepository接口
  • 添加测试数据
  • 测试
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档