文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于Spring Data Jpa 自定义方法实现问题

2024-04-02 19:55

关注

Spring Data Jpa 自定义方法的实现

最近项目中用到了Spring Data JPA,在里面我继承了一个PagingAndSortingRepository的接口,期望的是利用Spring Data JPA提供的便利。

同时我也希望自己有一个能定义自己方法的接口,因为单纯靠Spring Data JPA中提供的功能还是有很多业务逻辑实现不了,我必须自己实现。

那么问题来了:Spring Data JPA好处就是让我们省去了实现接口的过程,按照他们给的命名规范他们会自动实现我们的业务逻辑,那我们自己实现的接口要怎么注入到其中呢?

上网查找了好多资料,都没有说的太详细,更多的是照搬胡抄,这里是我亲自写的,可能很多人会用到,不多说上代码:

自己的接口


package com.mhc.dao; 
import org.springframework.stereotype.Repository; 
import com.mhc.entity.Person;
 
@Repository
public interface DeviceCategoryDaoCustom {
 public Person getsFather(Person person); 
}

主接口


public interface DeviceCategoryDao extends
  PagingAndSortingRepository<Person, String>, DeviceCategoryDaoCustom {  
}

上面是我的接口继承PagingAndSortingRepository、DeviceCategoryDaoCustom(我自己方法的接口)。

我新建一个类来实现我自己的接口


package com.mhc.dao; 
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional; 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; 
import com.mhc.entity.Person;
 
@Repository("crudRepositoryDaoCustom")
class DeviceCategoryDaoImpl implements DeviceCategoryDaoCustom {
 
 @Transactional
 public Person getsFather(Person person) {
  // TODO Auto-generated method stub
  Person father = new Person();
  father = person.getParentPerson();
  return father;
 }
}

在这里有个需要注意的地方,就是用不用implements的问题,如果用的话,他就会调用编译器的实现功能去实现我们自定义的接口也就是:DevicecategoryCustom。

如果去掉的话,他会去实现DeviceCategoryDao,那么会有人问,他怎么去自己找的呢。

事实上他是根据后面的Impl来寻找的。他不会提示@override,不过你写相同的方法他还是会覆盖(覆盖主接口中的同名方法,如果有的话)DeviceCategoryDao中的同名方法。你可以去尝试一下。

同时加上@Repository把他加入到Bean里面,这样下次用这个方法的时候Repository会自动找到他的(话说Spring团队真心NB)。然后我们交给spring托管、测试。。。。。Ok 真心赞

Spring Data Jpa自定义方法关键字

关键字 方法名举例 对应的SQL
And findByNameAndAge where name = ? and age = ?
Or findByNameOrAge where name = ? or age = ?
Is findByNameIs where name = ?
Equals findByNameEquals where name = ?
Between findByAgeBetween where age between ? and ?
LessThan findByAgeLessThan where age < ?
LessThanEquals findByAgeLessThanEqual where age <= ?
GreatorThan findByAgeGreaterThan where age > ?
GreatorThanEquals findByAgeGreaterThanEqual where age >= ?
After findByAgeAfter where age > ?
Before findByAgeBefore where age < ?
IsNull findByNameIsNull where name is null
IsNotNull,NotNull findByNameIsNotNull,findByNameNotNull where name is not null
Not findByNameNot where name <>?
In findByAgeIn where age in (?)
NotIn findByAgeNotIn where age not in (?)
NotLike findByNameNotLike where name not like ?
Like findByNameLike where name like ?
StartingWith findByNameStartingWith where name like ‘?%'
EndingWith findByNameEndingWith where name like ‘%?'
Containing,Contains findByNameContaining,findByNameContains where name like ‘%?%'
OrderBy findByOrderByAgeDesc order by age desc
True findByBossTrue where boss = true
False findByBossFalse where boss = false
IgnoreCase findByNameIgnoreCase where UPPER(name) = UPPER(?)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯