Spring Data JPA: 为单个Repository添加自定义方法

16 篇文章 0 订阅

我们在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;
    ......

}

自定义Repository接口

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

public interface CustomRepository {
    
    List<Blog> searchTitle(String key);

}

继承CustomRepository接口

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

public interface BlogRepository extends JpaRepository<Blog, Integer>, CustomRepository {
}

实现CustomRepository接口

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

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实例化完成后自动的调用被标注的方法。这里我们仅仅添加一条数据用来测试:

@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值来查询对应的博客。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值