文档章节

Spring JPA Repository 实例

龍sky腾
 龍sky腾
发布于 2017/08/17 19:09
字数 1140
阅读 32
收藏 0
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
 
import com.zwg.demo.model.MUser;
 
@Repository
//public interface UserRepository extends CrudRepository<User, Long> {
public interface UserRepository extends PagingAndSortingRepository<MUser, Long> {
     
    /*
        框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。
 
        在创建查询时,我们通过在方法名中使用属性名称来表达,比如 findByUserAddressZip ()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为 AccountInfo 类型):
         
        先判断 userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
        从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为 AccountInfo 的一个属性;
        接着处理剩下部分( AddressZip ),先判断 user 所对应的类型是否有 addressZip 属性,如果有,则表示该方法最终是根据 "AccountInfo.user.addressZip" 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 "AccountInfo.user.address.zip" 的值进行查询。
        在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:
         
        And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
        Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
        Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
        LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
        GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
        IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();
        IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
        NotNull --- 与 IsNotNull 等价;
        Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);
        NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
        OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
        Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);
        In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
        NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
     */
    //根据方法名查询
    public MUser findByName(String name);
    //分页排序查询  page从0开始
    public Page<MUser> findByName(String name, Pageable pageable);
     
     
    //根据JPSQL查询
    //表名称 必须使用类名称   sql语句结尾不能加 ;号
    //select 不能使用*
    //@Query("from MUser where email=:email")
    //@Query("select u from MUser u where u.email=:email")
    //public User getBySql(@Param("email")String email);
    //@Query(value="select new com.zwg.demo.model.MUser1(id,name) from MUser where email=?1")
    //public MUser1 getBySql(String email);
    @Query(value="select new com.zwg.demo.model.MUser(id,name) from MUser where email=?1")
    public MUser getBySql(String email);
    //根据自然的SQL查询
    //自然查询语句 表面是数据的名字 可以使用 *
    //@Query(value="select * from user where email=:email",nativeQuery=true)
    //@Query(value="select id,name, \"\" as email,\"\" as password from user where email=?1",nativeQuery=true)
    //public User getBySql(@Param("email")String email);
     
     
     
     
    /*
     @NamedQuery(或 @NamedNativeQuery)定义好查询语句,唯一要做的就是为该语句命名时,需要满足”DomainClass.methodName()”的命名规则。
     */
    //根据NamedQuery查询 
    //public MUser getBySql(String email);
}

 

联表查询多表数据

联表查询多表数据



public class UserGroup implements Serializable {

    private static final long serialVersionUID = -7367871287146067764L;

    @Id
    @GeneratedValue
    private Integer id;
    @Column(name = "group_name",length = 64)
    private String groupName;
}


public class UserA implements Serializable {

    private static final long serialVersionUID = -7367871287146067764L;

    @Id
    @GeneratedValue
    private Integer id;
    @Column(name = "last_name",length = 64)
    private String lastName;
    @Column(name = "first_name", length = 64)
    private String firstName;
    @Column(name = "group_id")
    private int groupId;

}

public class UserB {

    private UserA userA;
    private UserGroup group;
}


public interface UserARepository extends PagingAndSortingRepository<UserA,Integer> {


    //@Query(value = "select a from UserA a join UserGroup g on a.groupId=g.id where g.id=1")
    @Query(value = "select a.* from User_A a join User_Group g on a.group_id=g.id where g.id=1",nativeQuery = true)
    List<UserA> getUserInfo();

//    @Query(value = "select a from UserA a , UserGroup g  where a.groupId=g.id and g.id=1")
//    List<UserA> getUserInfo();

    @Query(value = "select new com.sample.springbatch.model.UserB(a,g) from UserA a , UserGroup g  where a.groupId=g.id and g.id=1")
    List<UserB> getUserBInfo();

    @Query(value = "select new com.sample.springbatch.model.UserB(a,g) from UserA a , UserGroup g  where a.groupId=g.id and g.id=1")
    Page<UserB> getUserBInfo(Pageable page);
}

 

© 著作权归作者所有

龍sky腾
粉丝 7
博文 41
码字总数 11647
作品 0
东城
项目经理
私信 提问
解决spring jpa中配置文件报'jpa:repositories'的问题

一、问题描述 使用spring jpa,报no declaration can be found for element 'jpa:repositories'错误的解决方案 Multiple annotations found at this line: - cvc-complex-type.2.4.c: The mat......

cloud-coder
2014/04/17
5K
1
(入门帖)使用 Spring Data JPA 简化 JPA 开发

本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例;接着重构该示例,并引入 Spring 框架,这两部分...

阿莱倪士
2014/01/09
675
0
Spring Data JPA 使用

Java 持久层框架访问数据库的方式大致分为两种。一种以 SQL 中心,封装一定程度的 JDBC 操作,比如 MyBatis。另一种是以 Java Entity 为中心,将实体的关系对应到数据库表之间的关系,如 OR...

TurboSanil
06/13
243
0
Spring Boot [组件学习-Spring Data JPA]

导读: 在上篇文章中对Spring MVC常用的一些注解做了简要的说明,在这篇文章中主要对Spring Data JPA 做一个简要的说明,并附有一个简单的例子,可以体会到Spring Data JPA 的强大之处。 Sp...

yangrd
2018/08/27
0
0
聊聊spring data jpa的SimpleJpaRepository

序 本文主要研究一下spring data jpa的SimpleJpaRepository JpaRepositoryImplementation spring-data-jpa-2.1.6.RELEASE-sources.jar!/org/springframework/data/jpa/repository/support/Jp......

go4it
04/14
64
0

没有更多内容

加载失败,请刷新页面

加载更多

JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
33分钟前
83
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
42分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
45分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
50分钟前
5
0
Apache Kudu 不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink 进行扩展。 使用的Apache Kudu 的Java 客户端。突然有天发现作业无法提交,一直报错。 后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验...

吐槽的达达仔
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部