永发信息网

jpa pagingandsortingrepository什么情况会过滤条件查询

答案:1  悬赏:20  手机版
解决时间 2021-01-31 02:54
jpa pagingandsortingrepository什么情况会过滤条件查询
最佳答案
AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案, 下面就对Spring Data相关知识作一个较为详细的描述。 一.Spring Data所解决的问题 Spring Data :提供了一整套数据访问层(DAO)的解决方案, 致力于减少数据访问层(DAO)的开发量。 它使用一个叫作Repository的接口类为基础, 它被定义为访问底层数据模型的超级接口。 而对于某种具体的数据访问操作,则在其子接口中定义。 public interface Repository { } 所有继承这个接口的interface都被spring所管理,此接口作为标识接口,功能就是用来控制domain模型的。 Spring Data可以让我们只定义接口,只要遵循spring data的规范,就无需写实现类。 二.什么是Repository? 二.一 Repository(资源库):通过用来访问领域对象的一个类似集合的接口, 在领域与数据映射层之间进行协调。这个叫法就类似于我们通常所说的DAO, 在这里,我们就按照这一习惯把数据访问层叫Repository Spring Data给我们提供几个Repository,基础的Repository提供了最基本的数据访问功能, 其几个子接口则扩展了一些功能。它们的继承关系如下: Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别 CrudRepository: 继承Repository,实现了一组CRUD相关的方法 PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法 JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法 JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法 我们自己定义的XxxxRepository需要继承JpaRepository, 这样我们的XxxxRepository接口就具备了通用的数据访问控制层的能力。 二.二 JpaRepository 所提供的基本功能 二.二.一 CrudRepository: 这个接口提供了最基本的对实体类的添删改查操作 T save(T entity);//保存单个实体 Iterable save(Iterable entities);//保存集合 T findOne(ID id);//根据id查找实体 boolean exists(ID id);//根据id判断实体是否存在 Iterable findAll();//查询所有实体,不用或慎用! long count();//查询实体数量 void delete(ID id);//根据Id删除实体 void delete(T entity);//删除一个实体 void delete(Iterable entities);//删除一个实体的集合 void deleteAll();//删除所有实体,不用或慎用! 二.二.二 PagingAndSortingRepository 这个接口提供了分页与排序功能 Iterable findAll(Sort sort);//排序 Page findAll(Pageable pageable);//分页查询(含排序功能) 二.二.三 JpaRepository 这个接口提供了JPA的相关功能 List findAll();//查找所有实体 List findAll(Sort sort);//排序 查找所有实体 List save(Iterable entities);//保存集合 void flush();//执行缓存与数据库同步 T saveAndFlush(T entity);//强制执行持久化 void deleteInBatch(Iterable entities);//删除一个实体集合 三.Spring data 查询 三.一 简单条件查询:查询某一个实体类或者集合 按照Spring data 定义的规则,查询方法以find|read|get开头 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写其余字母小写为规定。 例如:定义一个Entity实体类 class User{ private String firstname; private String lastname; } 使用And条件连接时,应这样写: findByLastnameAndFirstname(String lastname,String firstname); 条件的属性名称与个数要与参数的位置与个数一一对应 其他条件关键字如下表的定义: Table 三.一. Supported keywords inside method names 三.二 使用JPA NamedQueries (标准规范实现) 这种查询是标准的JPA规范所定义的,直接声明在Entity实体类上, 调用时采用在接口中定义与命名查询对应的method,由Spring Data根据方法名自动完成命名查询的寻找。 (一)在Entity实体类上使用@NamedQuery注解直接声明命名查询。 @Entity @NamedQuery(name = "User.findByEmailAddress", query = "select u from User u where u.emailAddress = ?一") public class User { } 注:定义多个时使用下面的注解 @NamedQueries(value = { @NamedQuery(name = User.QUERY_FIND_BY_LOGIN, query = "select u from User u where u." + User.PROP_LOGIN + " = :username"), @NamedQuery(name = "getUsernamePasswordToken", query = "select new com.aceona.weibo.vo.TokenBO(u.username,u.password) from User u where u." + User.PROP_LOGIN + " = :username")}) (二)在interface中定义与(一)对应的方法 public interface UserRepository extends JpaRepository { List findByLastname(String lastname); User findByEmailAddress(String emailAddress); } 三.三 使用@Query自定义查询(Spring Data提供的) 这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束, 将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring data的特有实现。 例如: public interface UserRepository extends JpaRepository { @Query("select u from User u where u.emailAddress = ?一") User findByEmailAddress(String emailAddress); } 三.四 @Query与 @Modifying 执行更新操作 这两个annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下: @Modifying @Query("update User u set u.firstname = ?一 where u.lastname = ?二") int setFixedFirstnameFor(String firstname, String lastname); 三.5 索引参数与命名参数 (一)索引参数如下所示,索引值从一开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致 @Modifying @Query("update User u set u.firstname = ?一 where u.lastname = ?二") int setFixedFirstnameFor(String firstname, String lastname); (二)命名参数(推荐使用这种方式) 可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。如下所示: public interface UserRepository extends JpaRepository { @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname") User findByLastnameOrFirstname(@Param("lastname") String lastname, @Param("firstname") String firstname); } 四. Transactionality(事务) 四.一 操作单个对象的事务 Spring Data提供了默认的事务处理方式,即所有的查询均声明为只读事务,对于持久化,更新与删除对象声明为有事务。 参见org.springframework.data.jpa.repository.support.SimpleJpaRepository @org.springframework.stereotype.Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepository, JpaSpecificationExecutor { …… @Transactional public void delete(ID id) { delete(findOne(id)); } …… } 对于自定义的方法,如需改变spring data提供的事务默认方式,可以在方法上注解@Transactional声明 四.二 涉及多个Repository的事务处理 进行多个Repository操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service层实现对多个Repository的调用,并在相应的方法上声明事务。 例如: @Service(“userManagement”) class UserManagementImpl implements UserManagement { private final UserRepository userRepository; private final RoleRepository roleRepository; @Autowired public UserManagementImpl(UserRepository userRepository, RoleRepository roleRepository) { this.userRepository = userRepository; this.roleRepository = roleRepository; } @Transactional public void addRoleToAllUsers(String roleName) { Role role = roleRepository.findByName(roleName); for (User user : userRepository.readAll()) { user.addRole(role); userRepository.save(user); } } 5.关于DAO层的规范 5.一对于不需要写实现类的情况: 定义XxxxRepository 接口并继承JpaRepository接口, 如果Spring data所提供的默认接口方法不够用,可以使用@Query在其中定义个性化的接口方法。 5.二对于需要写实现类的情况: 定义XxxxDao 接口并继承com.aceona.appleframework.persistent.data.GenericDao 书写XxxxDaoImpl实现类并继承com.aceona.appleframework.persistent.data.GenericJpaDao, 同时实现XxxxDao接口中的方法 在Service层调用XxxxRepository接口与XxxxDao接口完成相应的业务逻
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
淘宝申请退款,卖家也不理我,还会把钱退给我
求柴静雾霾调查,穹顶之下完整版纪录片1080p
翌顺汽车维修服务中心地址在什么地方,想过去
【寂寞星球】谁来占领我的寂寞星球 英文
哈士奇咳嗽怎么办?怎么回事?
玉林瀚泓汽车销售服务有限公司贵港店地址在什
单位一直与劳动者签雇佣合同怎么办
不是在浙江省高校毕业的大学专科,目前在杭州
【未来房子】未来的房子 作文
永进汽修城地址在什么地方,我要处理点事
永顺达汽车维修养护中心地址在哪,我要去那里
玉林庆铃汽车销售服务有限公司贵港分公司地址
优车库二手车公司地址有知道的么?有点事想过
江西省赣州市到福建省莆田市的行程路径
Apink的伊普美好看还是少女时代的Tiffany好看
推荐资讯
不记得买了几个基金,赎回了两个。现在想要销
有什么适合女生的单机游戏,不用联网的,
薇薇新娘婚纱摄影(西街)怎么去啊,我要去那办
单选题20世纪90年代国际上提出“绿色化学”是
普通生参加美术联考影不影响参加普通高考?
ansys 14 安装错误,there was a problem sta
长安汽车(集团)有限责任公司唐河亨亚销售服务
5对情侣真爱大考验3
依丽洁干洗连锁(富都店)怎么去啊,我要去那办
梦见別人捡到一个密码箱我拿着里面还有两条大
白毛村地址在什么地方,我要处理点事
为什么我的电脑不能装软件显示installer inte
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?