jparepository 怎样自定义查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jparepository 怎样自定义查询相关的知识,希望对你有一定的参考价值。
参考技术A 1、使用@Query自定义查询(Spring Data提供的)这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring data的特有实现。
例如:
public interface UserRepository extends JpaRepository<User, Long>
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
2、 @Query与 @Modifying 执行更新操作
这两个annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下:
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
3、 索引参数与命名参数
(1)索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
(2)命名参数(推荐使用这种方式)
可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。如下所示:
public interface UserRepository extends JpaRepository<User, Long>
@Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
User findByLastnameOrFirstname(@Param("lastname") String lastname,
@Param("firstname") String firstname);
详情可查看 :http://jishiweili.iteye.com/blog/2088265 参考技术B 两种方式:
方式1:假设Bean的属性xxx为主键,则在getXxx() 前添加以下注解
@Id
@SequenceGenerator(name="名称A", sequenceName="库中已存在的sequence名称",allocationSize=递增值)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="名称A")
方式2:假设Bean的属性xxx为主键,则在getXxx() 前添加以下注解
@Id
@TableGenerator(name="名称A",allocationSize=递增值)//若不指定递增值,则生成的主键值不一定连续
@GeneratedValue(strategy=GenerationType.TABLE, generator="名称A")
总结:方式1:针对Oracle效率略高,但需要手工创建sequence才能使用。
方式2:不依赖数据库,可移植性好,但相比方式1,效率略低。
以上是关于jparepository 怎样自定义查询的主要内容,如果未能解决你的问题,请参考以下文章
自定义 FieldSetMapper 中忽略的自动装配 JpaRepository 保存
Spring Data JPA - JpaRepository 中的自定义排序
尝试使用 EhCache 使用 Spring 和扩展 Hibernate 的 JpaRepository 的自定义 GenericDao 接口