springdata-jpa 八种查询方法

 使用:maven+Spring+jpa+Junit4

 查询方式:SQL,JPQL查询,Specification多条件复杂查询

 返回类型:list,list,list,Page

git源码地址:https://github.com/litblank/SpringFrame/tree/master/DEMO/SpringData_jpa

springdata-jpa 八种查询方法_第1张图片

 

1. Pom.xml

 


  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4.0.0
  com.litblack
  SpringData_jpa
  war
  0.0.1-SNAPSHOT
  SpringData_jpa Maven Webapp
  http://maven.apache.org
  
        4.3.4.RELEASE
  
  
    
      junit
      junit
      3.8.1
      test
    
            
        
            org.hibernate
            hibernate-core
            4.3.8.Final
             
                
                    org.javassist
                    javassist
                
            
        
        
        
            org.hibernate
            hibernate-entitymanager
            4.3.11.Final
            
                
                    org.javassist
                    javassist
                
            
        
        
        
            ojdbc
            ojdbc6
            11.2.0.4
        
        
        
            mysql
            mysql-connector-java
            5.1.6
        
        
        
            com.alibaba
            druid
            1.0.31
        
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
    
    <!-- Test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <!-- springdata -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.11.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons-core</artifactId>
        <version>1.4.1.RELEASE</version>
    </dependency>



SpringData_jpa

pom.xml

 

2. Spring-config.xml

 



    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans   
      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
      http://www.springframework.org/schema/context   
      http://www.springframework.org/schema/context/spring-context-3.1.xsd   
      http://www.springframework.org/schema/aop   
      http://www.springframework.org/schema/aop/spring-aop-3.1.xsd   
      http://www.springframework.org/schema/tx    
      http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
      http://www.springframework.org/schema/cache 
      http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
      http://www.springframework.org/schema/data/jpa
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
      http://www.springframework.org/schema/data/repository
      http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd">  
<context:component-scan base-package="com.litblack.jpa"></context:component-scan>
                                      
<!-- 配置Spring Data JPA扫描目录, repository 包 -->
<jpa:repositories base-package="com.litblack.jpa" /> 

<!-- 定义实体管理器工厂 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- 扫描pojo -->
    <property name="packagesToScan" value="com.litblack.jpa" />
    <property name="persistenceProvider">
        <bean class="org.hibernate.ejb.HibernatePersistence" />
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="true" />
               <property name="database" value="MYSQL" />
            <!-- <property name="database" value="ORACLE" />  -->
            <!-- <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> -->
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.generate_statistics" value="false" /><!-- 关闭打印的日志 -->
            <entry key="hibernate.query.substitutions" value="true 1, false 0" />
            <entry key="hibernate.default_batch_fetch_size" value="16" />
            <entry key="hibernate.max_fetch_depth" value="2" />
            <entry key="hibernate.bytecode.use_reflection_optimizer" value="true" />
            <entry key="hibernate.cache.use_second_level_cache" value="false" />
            <entry key="hibernate.cache.use_query_cache" value="false" />
        </map>
    </property>
</bean>

<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/cyd?useUnicode=true&amp;characterEncoding=UTF-8" />
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<!-- 启用 annotation事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />

Spring-config.xml

 

3. UserBean.java

 

package com.litblack.jpa;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.springframework.stereotype.Component;

@Table(name = "cyd_sys_user")
@Entity
public class UserBean {

@Id
@GeneratedValue(generator = "system_uuid")
@GenericGenerator(name = "system_uuid", strategy = "uuid")
private String id;
@Column(name="user_name")
private String userName;
@Column(name="create_time")
private Date createTime;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public Date getCreateTime() {
    return createTime;
}

public void setCreateTime(Date createTime) {
    this.createTime = createTime;
}

@Override
public String toString() {
    return "UserBean [id=" + id + ", userName=" + userName + ", createTime=" + createTime + "]";
}

}

POJO

 

4. UserBeanRepository.java

 

复制代码
package com.litblack.jpa;

import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
/**

  • SQL,JPQL查询

  • 返回:list,list,list,Page

  • 不能返回MAP

  • @author chenyd

  • 2018年1月10日
    */
    public interface UserBeanRepository extends JpaRepository, JpaSpecificationExecutor{

    UserBean findByUserName(String username);

    @Query("from UserBean where userName =?1")
    List
    find_Jpql_list_obj(String username);

    @Query("select userName from UserBean where userName =?1")
    List
    find_Jpql_list_one(String username);

    @Query("select userName,createTime from UserBean where userName =?1")
    List
    find_Jpql_list_morefield(String username);

    @Query("select userName,createTime from UserBean ")
    List
    find_Jpql_list_pojo_morefield();

    /**

    • 若返回类型为POJO,必须是所有POJO的所有字段,不能只查询某个字段
      */
      @Query(value
      ="select * from cyd_sys_user",nativeQuery=true)
      List
      find_SQL_pojo();

    @Query(value="select user_name,name from cyd_sys_user,t_user",nativeQuery=true)
    List
    find_SQL_obj();

      @Query(value = "select new map(userName,createTime) from UserBean")
        List> find_SQL_obj_map();

    /**

    • 分页需要 #pageable 标识
    • NativeJpaQuery
    • @param pageable
    • @return
      /
      @Query(value
      ="select user_name,name from cyd_sys_user,t_user /
      #pageable/ ",countQuery="select count() from cyd_sys_user,t_user",nativeQuery=true)
      Page
      find_SQL_obj(Pageable pageable);
      }
      复制代码

       

      5. BaseJunit4Test.java

      复制代码
      package com.litblack.jpa;
      

      import java.util.Date;
      import java.util.List;
      import java.util.Map;

      import javax.persistence.criteria.CriteriaBuilder;
      import javax.persistence.criteria.CriteriaQuery;
      import javax.persistence.criteria.Expression;
      import javax.persistence.criteria.Order;
      import javax.persistence.criteria.Predicate;
      import javax.persistence.criteria.Root;

      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.data.domain.Page;
      import org.springframework.data.domain.PageRequest;
      import org.springframework.data.domain.Pageable;
      import org.springframework.data.domain.Sort;
      import org.springframework.data.domain.Sort.Direction;
      import org.springframework.data.jpa.domain.Specification;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(locations
      = { "classpath*:/spring-config.xml" })
      public class BaseJunit4Test {

      @Autowired
      private UserBeanRepository userRepository;
      
      /**
       * 保存
       */
      public void save_obj() {
          System.out.println(userRepository);
          for (int i = 0; i < 100; i++) {
              UserBean entity = new UserBean();
              entity.setUserName("user_" + i);
              entity.setCreateTime(new Date());
              userRepository.save(entity);
          }
      
      }
      /**
       * 查询-所有
       */
      public void get_ALL_obj(){
          List<UserBean> list=userRepository.findAll();
          for (int i = 0; i < list.size(); i++) {
              UserBean obj = list.get(i);
              System.out.println(obj.getCreateTime());
          }
      }
      /**
       * 查询-one-obj,自定义接口
       */
      public void get_one_obj(){
          UserBean obj = userRepository.findByUserName("user_1");
          System.out.println(obj.toString());
      }
      /**
       * 根据JQPL查询,获取一个包含所有字段的OBJ
       * 返回: 一个pojo 集合
       */
      public void get_jqpl_obj(){
          List<UserBean> list=userRepository.find_Jpql_list_obj("user_2");
          for (int i = 0; i < list.size(); i++) {
              UserBean obj = list.get(i);
              System.out.println(obj.toString());
          }
      }
      /**
       * 根据JQPL查询,获取一个字段,
       * 返回:一个字段
       */
      public void get_jqpl_onestr(){
          List<String> list=userRepository.find_Jpql_list_one("user_2");
          for (int i = 0; i < list.size(); i++) {
              String obj = list.get(i);
              System.out.println(obj.toString());
          }
      }
      /**
       * 根据JQPL查询,一行数据,获取多个字段
       * 返回:object 不是POJO,不是string[]。是Object[] 
       * 注意:每个数据类型与POJO类型一致
       */
      public void get_jqpl_morestr(){
          List<Object> list=userRepository.find_Jpql_list_morefield("user_2");
          for (int i = 0; i < list.size(); i++) {
              Object[] obj = (Object[]) list.get(i);
              String username=(String) obj[0];
              Date date=(Date) obj[1];
              System.out.println(username+"\t"+date);
          }
      }
      /**
       * JQPL  获取指定字段的多个POJO
       */
      public void get_jqpl_pojo_morestr(){
          List<Object> list=userRepository.find_Jpql_list_pojo_morefield();
          for (int i = 0; i < list.size(); i++) {
              Object[] obj = (Object[]) list.get(i);
              String username=(String) obj[0];
              Date date=(Date) obj[1];
              System.out.println(username+"\t"+date);
          }
      }
      /**
       * SQL  获取POJO的所有字段,必须是所有POJO的所有字段
       */
      public void get_sql_pojo_allstr(){
          List<UserBean> list=userRepository.find_SQL_pojo();
          for (int i = 0; i < list.size(); i++) {
              UserBean obj = list.get(i);
              System.out.println(obj.toString());
          }
      }
      /**
       * SQL  获取多表查询的字段,可用于多表查询,组成临时表
       * 注意:每个数据类型与POJO类型一致
       */
      public void get_sql_obj_morestr(){
          List<Object> list=userRepository.find_SQL_obj();
          for (int i = 0; i < list.size(); i++) {
              Object[] obj = (Object[]) list.get(i);
              String username=(String) obj[0];
              String name=(String) obj[1];
              System.out.println(username+"\t"+name);
          }
      }
      /**
           * Hql 能返回list<Map>
           */
          @Test
          public void get_sql_obj_morestr1(){
              List<Map<String,Object>> list=userRepository.find_SQL_obj_map();
              for (int i = 0; i < list.size(); i++) {
                  Map<String,Object> obj = list.get(i);
                  System.out.println(obj);
              }
          }
      /** * 分页查询,先排序后分页 * select user_name,name from cyd_sys_user,t_user order by user_name desc limit ?, ? */ public void get_sql_obj_morestr_page(){ Sort sort=new Sort(Direction.DESC,"user_name"); Pageable page=new PageRequest(2,10,sort);//第二页,每页10条 Page<Object> p=userRepository.find_SQL_obj(page); List<Object> list=p.getContent(); for (int i = 0; i < list.size(); i++) { Object[] obj = (Object[]) list.get(i); String username=(String) obj[0]; String name=(String) obj[1]; System.out.println(username+"\t"+name); } } /** * 多条件查询,分页,排序 */ public void get_sql_obj_morestr_(){ Page<UserBean> p=userRepository.findAll(new Specification<UserBean>() { public Predicate toPredicate(Root<UserBean> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate stuNameLike = cb.like(root.<String> get("userName"), "%user_%"); Order oderby =cb.desc(root.<String> get("userName")); if(null != stuNameLike) query.where(stuNameLike); query.orderBy(oderby); return stuNameLike; } },new PageRequest(0, 20)); List<UserBean> list=p.getContent(); for (int i = 0; i < list.size(); i++) { UserBean obj = list.get(i); System.out.println(obj.toString()); } } /** * 通用单个实体查询 * @param T * @return */ public <T> Specification base_Specification(Class T){ return new Specification<T>(){ public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate predicate=cb.conjunction(); List<Expression<Boolean>> expression=predicate.getExpressions(); expression.add(cb.like(root.<String> get(""), "")); return predicate; }}; }

      }

      复制代码

       

      参考链接

      Spring Data JPA 简单查询--接口方法 https://www.cnblogs.com/rulian/p/6557471.html
      Spring data jpa中Query和@Query分别返回map结果集 https://www.cnblogs.com/wucongyun/p/6730582.html
      纯干货,Spring-data-jpa详解,全方位介绍。 http://www.cnblogs.com/dreamroute/p/5173896.html
      转载 spring-data-jpa 介绍 复杂查询,包括多表关联,分页,排序等 http://blog.csdn.net/mendeliangyang/article/details/52366799
       
      原文地址:https://www.cnblogs.com/litblank/p/8267333.html

      你可能感兴趣的:(springdata-jpa 八种查询方法)