1. 程式人生 > >Jpa動態查詢常用方法

Jpa動態查詢常用方法

使用Spring data JPA開發已經有一段時間了,這期間學習了一些東西,也遇到了一些問題,在這裡和大家分享一下。

前言:

Spring data簡介:

Spring Data是一個用於簡化資料庫訪問,並支援雲服務的開源框架。其主要目標是使得對資料的訪問變得方便快捷,並支援map-reduce框架和雲端計算資料服務。 Spring Data 包含多個子專案:

Commons - 提供共享的基礎框架,適合各個子專案使用,支援跨資料庫持久化

JPA - 簡化建立 JPA 資料訪問層和跨儲存的持久層功能

Hadoop - 基於 Spring 的 Hadoop 作業配置和一個 POJO 程式設計模型的 

MapReduce 作業

Key-Value  - 集成了 Redis 和 Riak ,提供多個常用場景下的簡單封裝

Document - 整合文件資料庫:CouchDB 和 MongoDB 並提供基本的配置對映和資料庫支援

Graph - 整合 Neo4j 提供強大的基於 POJO 的程式設計模型

Graph Roo AddOn - Roo support for Neo4j

JDBC Extensions - 支援 Oracle RAD、高階佇列和高階資料型別

Mapping - 基於 Grails 的提供物件對映框架,支援不同的資料庫

Examples - 示例程式、文件和圖資料庫

Guidance - 高階文件

一、Spring data JPA簡介

Spring data JPASpringORM框架,以及JPA規範的基礎上,封裝的一套JPA應用框架,並提供了一整套的資料訪問層解決方案。

二、Spring data JPA的功能

Spring data JPA的功能非常的強大,這裡我們先跳過環境搭建這一步,來一睹Spring data JPA的“芳容”。

Spring data JPA提供給使用者使用的,主要有以下幾個介面:

Repository:僅僅是一個標識,表明任何繼承它的均為倉庫介面類,方便Spring自動掃描識別 
CrudRepository:繼承Repository,實現了一組CRUD

相關的方法 
PagingAndSortingRepository:繼承CrudRepository,實現了一組分頁排序相關的方法 
JpaRepository:繼承PagingAndSortingRepository,實現一組JPA規範相關的方法 
JpaSpecificationExecutor:比較特殊,不屬於Repository體系,實現一組JPA Criteria查詢相關的方法

三、Spring data JPA的介面

1、CrudRepository介面

建立一個Entity類:

[java] view plain copy print?
  1. @Entity
  2. @Table(name=“USER”)  
  3. publicclass User {  
  4.     @Id
  5.     @GeneratedValue
  6.     private Integer id;  
  7.     //賬號
  8.     private String account;  
  9.     //姓名
  10.     private String name;  
  11.     //密碼
  12.     private String password;  
  13.     // 郵箱
  14.     private String email;  
  15. }  
@Entity
@Table(name="USER")
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    //賬號
    private String account;

    //姓名
    private String name;

    //密碼
    private String password;

    // 郵箱
    private String email;
}
編寫介面,並繼承CrudRepository介面:
[java] view plain copy print?
  1. publicinterface UserRepository extends CrudRepository<User, Integer> {  
  2. }  
public interface UserRepository extends CrudRepository<User, Integer> {

}
編寫測試類(為了更直觀的看到效果,所有測試類都沒有使用斷言,直接使用的列印語句)
[java] view plain copy print?
  1. publicclass UserRepositoryTest {  
  2.     @Autowired
  3.     private UserRepository dao;  
  4.     @Test//儲存
  5.     publicvoid testSave(){  
  6.         User user = new User();  
  7.         user.setName(”chhliu”);  
  8.         user.setAccount(”10000”);  
  9.         user.setEmail([email protected]);  
  10.         user.setPassword(”123456”);  
  11.         dao.save(user);  
  12.     }  
  13.     @Test//批量儲存
  14.     publicvoid testSave1(){  
  15.         List<User> users = new ArrayList<User>();  
  16.         User user = new User();  
  17.         user.setName(”tanjie”);  
  18.         user.setAccount(”10000”);  
  19.         user.setEmail([email protected]);  
  20.         user.setPassword(”123456”);  
  21.         users.add(user);  
  22.         user = new User();  
  23.         user.setName(”esdong”);  
  24.         user.setAccount(”10000”);  
  25.         user.setEmail([email protected]);  
  26.         user.setPassword(”123456”);  
  27.         users.add(user);  
  28.         user = new User();  
  29.         user.setName(”qinhongfei”);  
  30.         user.setAccount(”10000”);  
  31.         user.setEmail([email protected]);  
  32.         user.setPassword(”123456”);  
  33.         users.add(user);  
  34.         user = new User();  
  35.         user.setName(”huizhang”);  
  36.         user.setAccount(”10000”);  
  37.         user.setEmail([email protected]);  
  38.         user.setPassword(”123456”);  
  39.         users.add(user);  
  40.         user = new User();  
  41.         user.setName(”caican”);  
  42.         user.setAccount(”10000”);  
  43.         user.setEmail([email protected]);  
  44.         user.setPassword(”123456”);  
  45.         users.add(user);  
  46.         dao.save(users);  
  47.     }  
  48.     @Test//更新
  49.     publicvoid testUpdate(){  
  50.         User user = dao.findOne(1);  
  51.         user.setPassword(”123890”);// 要想這樣實現更新的功能,需要在service層加上@Transaction事物註解
  52.     }  
  53.     @Test//刪除
  54.     publicvoid testDelete(){  
  55.         dao.delete(2);  
  56.     }  
  57.     @Test//查詢所有
  58.     publicvoid testFindAll(){  
  59.         List<User> users = (List<User>) dao.findAll();  
  60.         System.out.println(JSON.toJSONString(users));  
  61.     }  
  62.     @Test//判斷指定的id物件是否存在
  63.     publicvoid testIsExist(){  
  64.         boolean isExist = dao.exists(8);  
  65.         System.out.println(isExist);  
  66.     }  
  67.     @Test//通過id列表來查詢
  68.     publicvoid testFindUserByIds(){  
  69.         List<Integer> listIds = new ArrayList<Integer>();  
  70.         listIds.add(2);  
  71.         listIds.add(4);  
  72.         listIds.add(7);  
  73.         List<User> users = (List<User>) dao.findAll(listIds);  
  74.         System.out.println(JSON.toJSONString(users));  
  75.     }  
  76. }  
public class UserRepositoryTest {
    @Autowired
    private UserRepository dao;

    @Test//儲存
    public void testSave(){
        User user = new User();
        user.setName("chhliu");
        user.setAccount("10000");
        user.setEmail("[email protected]");
        user.setPassword("123456");
        dao.save(user);
    }

    @Test//批量儲存
    public void testSave1(){
        List<User> users = new ArrayList<User>();
        User user = new User();
        user.setName("tanjie");
        user.setAccount("10000");
        user.setEmail("[email protected]");
        user.setPassword("123456");
        users.add(user);
        user = new User();
        user.setName("esdong");
        user.setAccount("10000");
        user.setEmail("[email protected]");
        user.setPassword("123456");
        users.add(user);
        user = new User();
        user.setName("qinhongfei");
        user.setAccount("10000");
        user.setEmail("[email protected]");
        user.setPassword("123456");
        users.add(user);
        user = new User();
        user.setName("huizhang");
        user.setAccount("10000");
        user.setEmail("[email protected]");
        user.setPassword("123456");
        users.add(user);
        user = new User();
        user.setName("caican");
        user.setAccount("10000");
        user.setEmail("[email protected]");
        user.setPassword("123456");
        users.add(user);
        dao.save(users);
    }

    @Test//更新
    public void testUpdate(){
        User user = dao.findOne(1);
        user.setPassword("123890");// 要想這樣實現更新的功能,需要在service層加上@Transaction事物註解
    }

    @Test//刪除
    public void testDelete(){
        dao.delete(2);
    }

    @Test//查詢所有
    public void testFindAll(){
        List<User> users = (List<User>) dao.findAll();
        System.out.println(JSON.toJSONString(users));
    }

    @Test//判斷指定的id物件是否存在
    public void testIsExist(){
        boolean isExist = dao.exists(8);
        System.out.println(isExist);
    }

    @Test//通過id列表來查詢
    public void testFindUserByIds(){
        List<Integer> listIds = new ArrayList<Integer>();
        listIds.add(2);
        listIds.add(4);
        listIds.add(7);
        List<User> users = (List<User>) dao.findAll(listIds);
        System.out.println(JSON.toJSONString(users));
    }
}
大家可以看出,到這裡,我就只寫了一個介面類,並沒有實現這個介面類,就可以完成基本的CRUD操作。因為這個介面會自動為域物件建立增刪改查方法,供業務層直接使用。

該介面的定義如下,總共提供了11個方法,基本上可以滿足簡單的CRUD操作以及批量操作:

[java] view plain copy print?
  1. @NoRepositoryBean
  2. publicinterface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {  
  3.     <S extends T> S save(S entity);//儲存
  4.     <S extends T> Iterable<S> save(Iterable<S> entities);//批量儲存
  5.     T findOne(ID id);//根據id查詢一個物件
  6.     boolean exists(ID id);//判斷物件是否存在
  7.     Iterable<T> findAll();//查詢所有的物件
  8.     Iterable<T> findAll(Iterable<ID> ids);//根據id列表查詢所有的物件
  9.     long count();//計算物件的總個數
  10.     void delete(ID id);//根據id刪除
  11.     void delete(T entity);//刪除物件
  12.     void delete(Iterable<? extends T> entities);//批量刪除
  13.     void deleteAll();//刪除所有
  14. }  
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S entity);//儲存
    <S extends T> Iterable<S> save(Iterable<S> entities);//批量儲存
    T findOne(ID id);//根據id查詢一個物件
    boolean exists(ID id);//判斷物件是否存在
    Iterable<T> findAll();//查詢所有的物件
    Iterable<T> findAll(Iterable<ID> ids);//根據id列表查詢所有的物件
    long count();//計算物件的總個數
    void delete(ID id);//根據id刪除
    void delete(T entity);//刪除物件
    void delete(Iterable<? extends T> entities);//批量刪除
    void deleteAll();//刪除所有
}
2、PagingAndSortingRepository介面

PagingAndSortingRepository介面繼承了CrudRepository介面。

編寫介面,並繼承PagingAndSortingRepository介面

[java] view plain copy print?
  1. publicinterface UserRepositoryWithOrder extends
  2.         PagingAndSortingRepository<User, Integer> {  
  3. }  
public interface UserRepositoryWithOrder extends
        PagingAndSortingRepository<User, Integer> {

}
編寫測試類:
[java] view plain copy print?
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = { “classpath:applicationContext-config.xml” })  
  3. @TransactionConfiguration(defaultRollback = false)  
  4. @Transactional
  5. publicclass UserRepositoryWithOrderTest {  
  6.     @Autowired
  7.     private UserRepositoryWithOrder dao;  
  8.     @Test
  9.     publicvoid testOrder(){  
  10.         Sort sort = new Sort(Direction.DESC, “id”);  
  11.         Pageable pageable = new PageRequest(05, sort);  
  12.         Page<User> page = dao.findAll(pageable);  
  13.         System.out.println(JSON.toJSONString(page));  
  14.         System.out.println(page.getSize());  
  15.     }  
  16. }  
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-config.xml" })
@TransactionConfiguration(defaultRollback = false)
@Transactional
public class UserRepositoryWithOrderTest {
    @Autowired
    private UserRepositoryWithOrder dao;

    @Test
    public void testOrder(){
        Sort sort = new Sort(Direction.DESC, "id");
        Pageable pageable = new PageRequest(0, 5, sort);
        Page<User> page = dao.findAll(pageable);
        System.out.println(JSON.toJSONString(page));
        System.out.println(page.getSize());
    }
}
只要繼承了這個介面,Spring data JPA就已經為你提供了分頁和排序的功能了。該介面的定義如下,主要提供了兩個方法,供使用,其中T是要操作的實體類,ID是實體類主鍵的型別
[java] view plain copy print?
  1. @NoRepositoryBean
  2. publicinterface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {  
  3.     Iterable<T> findAll(Sort sort);// 不帶分頁的排序
  4.     Page<T> findAll(Pageable pageable);// 帶分頁的排序
  5. }  
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort sort);// 不帶分頁的排序
    Page<T> findAll(Pageable pageable);// 帶分頁的排序
}
3、JpaRepository介面

如果業務需要即提供CRUD操作,又需要提供分頁以及排序功能,那麼就可以直接繼承這個介面。該介面繼承了PagingAndSortingRepository介面。

介面定義如下:

[java] view plain copy print?
  1. publicinterface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {  
  2.     List<T> findAll();//查詢所有物件,不排序
  3.     List<T> findAll(Sort sort);//查詢所有物件,並排序
  4.     <S extends T> List<S> save(Iterable<S> entities);//批量儲存
  5.     void flush();//強制快取與資料庫同步
  6.     T saveAndFlush(T entity);//儲存並強制同步
  7.     void deleteInBatch(Iterable<T> entities);//批量刪除
  8.     void deleteAllInBatch();//刪除所有
  9. }  
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
    List<T> findAll();//查詢所有物件,不排序
    List<T> findAll(Sort sort);//查詢所有物件,並排序
    <S extends T> List<S> save(Iterable<S> entities);//批量儲存
    void flush();//強制快取與資料庫同步
    T saveAndFlush(T entity);//儲存並強制同步
    void deleteInBatch(Iterable<T> entities);//批量刪除
    void deleteAllInBatch();//刪除所有
}
4、JpaSpecificationExecutor介面

該介面提供了對JPA Criteria查詢的支援。注意,這個介面很特殊,不屬於Repository體系,而Spring data JPA不會自動掃描識別,所以會報找不到對應的Bean,我們只需要繼承任意一個繼承了Repository的子介面或直接繼承Repository介面,Spring data JPA就會自動掃描識別,進行統一的管理。

編寫介面如下:

[java] view plain copy print?
  1. publicinterface SpecificationExecutorRepository extends CrudRepository<User, Integer>,  
  2.         JpaSpecificationExecutor<User> {  
  3. }  
public interface SpecificationExecutorRepository extends CrudRepository<User, Integer>,
        JpaSpecificationExecutor<User> {

}
Service類:
[java] view plain copy print?
  1. @Service
  2. publicclass SpecificationExecutorRepositoryManager {  
  3.     @Autowired
  4.     private SpecificationExecutorRepository dao;  
  5.     /** 
  6.      * 描述:根據name來查詢使用者 
  7.      */
  8.     public User findUserByName(final String name){  
  9.         return dao.findOne(new Specification<User>() {  
  10.             @Override
  11.             public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query,  
  12.                     CriteriaBuilder cb) {  
  13.                 Predicate predicate = cb.equal(root.get(”name”), name);  
  14.                 return predicate;  
  15.             }  
  16.         });  
  17.     }  
  18.     /** 
  19.      * 描述:根據name和email來查詢使用者 
  20.      */
  21.     public User findUserByNameAndEmail(final String name, final String email){  
  22.         return dao.findOne(new Specification<User>() {  
  23.             @Override
  24.             public Predicate toPredicate(Root<User> root,  
  25.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  26.                 List<Predicate> list = new ArrayList<Predicate>();  
  27.                 Predicate predicate1 = cb.equal(root.get(”name”), name);  
  28.                 Predicate predicate2 = cb.equal(root.get(”email”), email);  
  29.                 list.add(predicate1);  
  30.                 list.add(predicate2);  
  31.                 // 注意此處的處理
  32.                 Predicate[] p = new Predicate[list.size()];  
  33.                 return cb.and(list.toArray(p));  
  34.             }  
  35.         });  
  36.     }  
  37.     /** 
  38.      * 描述:組合查詢 
  39.      */
  40.     public User findUserByUser(final User userVo){  
  41.         return dao.findOne(new Specification<User>() {  
  42.             @Override
  43.             public Predicate toPredicate(Root<User> root,  
  44.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  45.                 Predicate predicate = cb.equal(root.get(”name”), userVo.getName());  
  46.                 cb.and(predicate, cb.equal(root.get(”email”), userVo.getEmail()));  
  47.                 cb.and(predicate, cb.equal(root.get(”password”), userVo.getPassword()));  
  48.                 return predicate;  
  49.             }  
  50.         });  
  51.     }  
  52.     /** 
  53.      * 描述:範圍查詢in方法,例如查詢使用者id在[2,10]中的使用者 
  54.      */
  55.     public List<User> findUserByIds(final List<Integer> ids){  
  56.         return dao.findAll(new Specification<User>() {  
  57.             @Override
  58.             public Predicate toPredicate(Root<User> root,  
  59.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  60.                 return root.in(ids);  
  61.             }  
  62.         });  
  63.     }  
  64.     /** 
  65.      * 描述:範圍查詢gt方法,例如查詢使用者id大於9的所有使用者 
  66.      */
  67.     public List<User> findUserByGtId(finalint id){  
  68.         return dao.findAll(new Specification<User>() {  
  69.             @Override
  70.             public Predicate toPredicate(Root<User> root,  
  71.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  72.                 return cb.gt(root.get(“id”).as(Integer.class), id);  
  73.             }  
  74.         });  
  75.     }  
  76.     /** 
  77.      * 描述:範圍查詢lt方法,例如查詢使用者id小於10的使用者 
  78.      */
  79.     public List<User> findUserByLtId(finalint id){  
  80.         return dao.findAll(new Specification<User>() {  
  81.             @Override
  82.             public Predicate toPredicate(Root<User> root,  
  83.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  84.                 return cb.lt(root.get(“id”).as(Integer.class), id);  
  85.             }  
  86.         });  
  87.     }  
  88.     /** 
  89.      * 描述:範圍查詢between方法,例如查詢id在3和10之間的使用者 
  90.      */
  91.     public List<User> findUserBetweenId(finalint start, finalint end){  
  92.         return dao.findAll(new Specification<User>() {  
  93.             @Override
  94.             public Predicate toPredicate(Root<User> root,  
  95.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  96.                 return cb.between(root.get(“id”).as(Integer.class), start, end);  
  97.             }  
  98.         });  
  99.     }  
  100.     /** 
  101.      * 描述:排序和分頁操作 
  102.      */
  103.     public Page<User> findUserAndOrder(finalint id){  
  104.         Sort sort = new Sort(Direction.DESC, “id”);  
  105.         return dao.findAll(new Specification<User>() {  
  106.             @Override
  107.             public Predicate toPredicate(Root<User> root,  
  108.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  109.                 return cb.gt(root.get(“id”).as(Integer.class), id);  
  110.             }  
  111.         }, new PageRequest(05, sort));  
  112.     }  
  113.     /** 
  114.      * 描述:只有排序操作 
  115.      */
  116.     public List<User> findUserAndOrderSecondMethod(finalint id){  
  117.         return dao.findAll(new Specification<User>() {  
  118.             @Override
  119.             public Predicate toPredicate(Root<User> root,  
  120.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
  121.                 cb.gt(root.get(”id”).as(Integer.class), id);  
  122.                 query.orderBy(cb.desc(root.get(”id”).as(Integer.class)));  
  123.                 return query.getRestriction();  
  124.             }  
  125.         });  
  126.     }  
  127. }  
@Service
public class SpecificationExecutorRepositoryManager {
    @Autowired
    private SpecificationExecutorRepository dao;
    /**
     * 描述:根據name來查詢使用者
     */
    public User findUserByName(final String name){
        return dao.findOne(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query,
                    CriteriaBuilder cb) {
                Predicate predicate = cb.equal(root.get("name"), name);
                return predicate;
            }
        });
    }

    /**
     * 描述:根據name和email來查詢使用者
     */
    public User findUserByNameAndEmail(final String name, final String email){
        return dao.findOne(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> list = new ArrayList<Predicate>();
                Predicate predicate1 = cb.equal(root.get("name"), name);
                Predicate predicate2 = cb.equal(root.get("email"), email);
                list.add(predicate1);
                list.add(predicate2);
                // 注意此處的處理
                Predicate[] p = new Predicate[list.size()];
                return cb.and(list.toArray(p));
            }
        });
    }

    /**
     * 描述:組合查詢
     */
    public User findUserByUser(final User userVo){
        return dao.findOne(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                Predicate predicate = cb.equal(root.get("name"), userVo.getName());
                cb.and(predicate, cb.equal(root.get("email"), userVo.getEmail()));
                cb.and(predicate, cb.equal(root.get("password"), userVo.getPassword()));
                return predicate;
            }
        });
    }

    /**
     * 描述:範圍查詢in方法,例如查詢使用者id在[2,10]中的使用者
     */
    public List<User> findUserByIds(final List<Integer> ids){
        return dao.findAll(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                return root.in(ids);
            }
        });
    }

    /**
     * 描述:範圍查詢gt方法,例如查詢使用者id大於9的所有使用者
     */
    public List<User> findUserByGtId(final int id){
        return dao.findAll(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.gt(root.get("id").as(Integer.class), id);
            }
        });
    }

    /**
     * 描述:範圍查詢lt方法,例如查詢使用者id小於10的使用者
     */
    public List<User> findUserByLtId(final int id){
        return dao.findAll(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.lt(root.get("id").as(Integer.class), id);
            }
        });
    }

    /**
     * 描述:範圍查詢between方法,例如查詢id在3和10之間的使用者
     */
    public List<User> findUserBetweenId(final int start, final int end){
        return dao.findAll(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.between(root.get("id").as(Integer.class), start, end);
            }
        });
    }

    /**
     * 描述:排序和分頁操作
     */
    public Page<User> findUserAndOrder(final int id){
        Sort sort = new Sort(Direction.DESC, "id");
        return dao.findAll(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.gt(root.get("id").as(Integer.class), id);
            }
        }, new PageRequest(0, 5, sort));
    }

    /**
     * 描述:只有排序操作
     */
    public List<User> findUserAndOrderSecondMethod(final int id){
        return dao.findAll(new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root,
                    CriteriaQuery<?> query, CriteriaBuilder cb) {
                cb.gt(root.get("id").as(Integer.class), id);
                query.orderBy(cb.desc(root.get("id").as(Integer.class)));
                return query.getRestriction();
            }
        });
    }
}
測試類:
[java] view plain copy print?
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = { “classpath:applicationContext-config.xml” })  
  3. @TransactionConfiguration(defaultRollback = false)  
  4. @Transactional
  5. publicclass SpecificationExecutorRepositoryManagerTest {  
  6.     @Autowired
  7.     private SpecificationExecutorRepositoryManager manager;  
  8.     @Test
  9.     publicvoid testFindUserByName(){  
  10.         User user = manager.findUserByName(”chhliu”);  
  11.         System.out.println(JSON.toJSONString(user));  
  12.     }  
  13.     @Test
  14.     publicvoid testFindUserByNameAndEmail(){  
  15.         User user = manager.findUserByNameAndEmail(”chhliu”[email protected]);  
  16.         System.out.println(JSON.toJSONString(user));  
  17.     }  
  18.     @Test
  19.     publicvoid testFindUserByUserVo(){  
  20.         User user = new User();  
  21.         user.setName(”chhliu”);  
  22.         user.setEmail([email protected]);  
  23.         User u = manager.findUserByUser(user);  
  24.         System.out.println(JSON.toJSONString(u));  
  25.     }  
  26.     @Test
  27.     publicvoid testFindUserByIds(){  
  28.         List<User> users = manager.findUserByIds(new ArrayList<Integer>(Arrays.asList(1,3,5,6)));  
  29.         System.out.println(JSON.toJSONString(users));  
  30.     }  
  31.     @Test
  32.     publicvoid testFindUserByGtId(){  
  33.         List<User> users = manager.findUserByGtId(5);  
  34.         System.out.println(JSON.toJSONString(users));  
  35.     }  
  36.     @Test
  37.     publicvoid testFindUserByLtId(){  
  38.         List<User> users = manager.findUserByLtId(5);  
  39.         System.out.println(JSON.toJSONString(users));  
  40.     }  
  41.     @Test
  42.     publicvoid testFindUserBetweenId(){  
  43.         List<User> users = manager.findUserBetweenId(49);  
  44.         System.out.println(JSON.toJSONString(users));  
  45.     }  
  46.     @Test
  47.     publicvoid testFindUserAndOrder(){  
  48.         Page<User> users = manager.findUserAndOrder(1);  
  49.         System.out.println(JSON.toJSONString(users));  
  50.     }  
  51.     @Test
  52.     publicvoid testFindUserAndOrderSecondMethod(){  
  53.         List<User> users = manager.findUserAndOrderSecondMethod(1);  
  54.         System.out.println(JSON.toJSONString(users));  
  55.     }  
  56. }  
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-config.xml" })
@TransactionConfigu