1. 程式人生 > >spring data 複雜的查詢,不用寫sql

spring data 複雜的查詢,不用寫sql

轉載自:http://www.cnblogs.com/ityouknow/p/5891443.html


方便自己以後檢視


spring boot(五):spring data jpa的使用

在上篇文章springboot(二):web綜合開發中簡單介紹了一下spring data jpa的基礎性使用,這篇文章將更加全面的介紹spring data jpa 常見用法以及注意事項

使用spring data jpa 開發時,發現國內對spring boot jpa全面介紹的文章比較少案例也比較零碎,因此寫文章總結一下。本人也正在翻譯Spring Data JPA 參考指南

,有興趣的同學歡迎聯絡我,一起加入翻譯中!


spring data jpa介紹

首先了解JPA是什麼?

JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關聯對映工具來管理Java應用中的關係資料。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自為營的局面。值得注意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。從目前的開發社群的反應上看,JPA受到了極大的支援和讚揚,其中就包括了Spring與EJB3.0的開發團隊。

注意:JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麼我們就可以叫他們為JPA的實現產品。

spring data jpa

Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的程式碼即可實現對資料的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴充套件!學習並使用 Spring Data JPA 可以極大提高開發效率!

spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現


基本查詢

基本查詢也分為兩種,一種是spring data預設已經實現,一種是根據查詢的方法來自動解析成SQL。

預先生成方法

spring data jpa 預設預先生成了一些基本的CURD的方法,例如:增、刪、改等等

1 繼承JpaRepository

public interface UserRepository extends JpaRepository<User, Long> {
}

2 使用預設方法

@Test
public void testBaseQuery() throws Exception {
    User user=new User();
    userRepository.findAll();
    userRepository.findOne(1l);
    userRepository.save(user);
    userRepository.delete(user);
    userRepository.count();
    userRepository.exists(1l);
    // ...
}

就不解釋了根據方法名就看出意思來

自定義簡單查詢

自定義的簡單查詢就是根據方法名來自動生成SQL,主要的語法是findXXBy,readAXXBy,queryXXBy,countXXBygetXXBy後面跟屬性名稱:

User findByUserName(String userName);

也使用一些加一些關鍵字And、 Or

User findByUserNameOrEmail(String username, String email);

修改、刪除、統計也是類似語法

Long deleteById(Long id);

Long countByUserName(String userName)

基本上SQL體系中的關鍵詞都可以使用,例如:LIKE、 IgnoreCase、 OrderBy

List<User> findByEmailLike(String email);

User findByUserNameIgnoreCase(String userName);
    
List<User> findByUserNameOrderByEmailDesc(String email);

具體的關鍵字,使用方法和生產成SQL如下表所示

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)


複雜查詢

在實際的開發中我們需要用到分頁、刪選、連表等查詢的時候就需要特殊的方法或者自定義SQL

分頁查詢

分頁查詢在實際使用中非常普遍了,spring data jpa已經幫我們實現了分頁的功能,在查詢的方法中,需要傳入引數Pageable
,當查詢中有多個引數的時候Pageable建議做為最後一個引數傳入

Page<User> findALL(Pageable pageable);
    
Page<User> findByUserName(String userName,Pageable pageable);

Pageable 是spring封裝的分頁實現類,使用的時候需要傳入頁數、每頁條數和排序規則

@Test
public void testPageQuery() throws Exception {
    int page=1,size=10;
    Sort sort = new Sort(Direction.DESC, "id");
    Pageable pageable = new PageRequest(page, size, sort);
    userRepository.findALL(pageable);
    userRepository.findByUserName("testName", pageable);
}

限制查詢

有時候我們只需要查詢前N個元素,或者支取前一個實體。

ser findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

自定義SQL查詢

其實Spring data 覺大部分的SQL都可以根據方法名定義的方式來實現,但是由於某些原因我們想使用自定義的SQL來查詢,spring data也是完美支援的;在SQL的查詢方法上面使用@Query註解,如涉及到刪除和修改在需要加上@Modifying.也可以根據需要新增 @Transactional 對事物的支援,查詢超時的設定等

@Modifying
@Query("update User u set u.userName = ?1 where c.id = ?2")
int modifyByIdAndUserId(String  userName, Long id);
    
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
  
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddress = ?1")
    User findByEmailAddress(String emailAddress);

多表查詢

多表查詢在spring data jpa中有兩種實現方式,第一種是利用hibernate的級聯查詢來實現,第二種是建立一個結果集的介面來接收連表查詢後的結果,這裡主要第二種方式。

首先需要定義一個結果集的介面類。

public interface HotelSummary {

    City getCity();

    String getName();

    Double getAverageRating();

    default Integer getAverageRatingRounded() {
        return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
    }

}

查詢的方法返回型別設定為新建立的介面

@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
        - "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
Page<HotelSummary> findByCity(City city, Pageable pageable);

@Query("select h.name as name, avg(r.rating) as averageRating "
        - "from Hotel h left outer join h.reviews r  group by h")
Page<HotelSummary> findByCity(Pageable pageable);

使用

Page<HotelSummary> hotels = this.hotelRepository.findByCity(new PageRequest(0, 10, Direction.ASC, "name"));
for(HotelSummary summay:hotels){
        System.out.println("Name" +summay.getName());
    }

在執行中Spring會給介面(HotelSummary)自動生產一個代理類來接收返回的結果,程式碼彙總使用getXX的形式來獲取


多資料來源的支援

同源資料庫的多源支援

日常專案中因為使用的分散式開發模式,不同的服務有不同的資料來源,常常需要在一個專案中使用多個數據源,因此需要配置sping data jpa對多資料來源的使用,一般分一下為三步:

  • 1 配置多資料來源
  • 2 不同源的實體類放入不同包路徑
  • 3 宣告不同的包路徑下使用不同的資料來源、事務支援

這裡有一篇文章寫的很清楚:Spring Boot多資料來源配置與使用

異構資料庫多源支援

比如我們的專案中,即需要對mysql的支援,也需要對mongodb的查詢等。

實體類宣告@Entity 關係型資料庫支援型別、宣告@Document 為mongodb支援型別,不同的資料來源使用不同的實體就可以了

interface PersonRepository 
            
           

相關推薦

spring data 複雜查詢不用sql

轉載自:http://www.cnblogs.com/ityouknow/p/5891443.html 方便自己以後檢視 spring boot(五):spring data jpa的使用 在上篇文章springboot(二):web綜

spring-data-jpa 介紹 複雜查詢包括多表關聯分頁排序

本篇進行Spring-data-jpa的介紹,幾乎涵蓋該框架的所有方面,在日常的開發當中,基本上能滿足所有需求。這裡不講解JPA和Spring-data-jpa單獨使用,所有的內容都是在和Spring整合的環境中實現。如果需要了解該框架的入門,百度一下,很多入門的介紹。在這篇

一個表裏有多個字段需要同時使用字典表進行關聯顯示如何sql查詢語句

TE bbs 創建者 一個 需要 rom signed assigned user 參考:https://bbs.csdn.net/topics/330032307 數據庫裏面有一個字典表,這張表裏面有id段和對應的名字字段。在另外一個記錄的表裏面有對應的上述字典表的id

spring data jpa 查詢自定義欄位轉換為自定義實體

目標:查詢資料庫中的欄位,然後轉換成 JSON 格式的資料,返回前臺。 環境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 entity 對映資料庫(非專業 java 不知道這怎麼說) @Entity @Tab

delphi+access 執行時間段查詢直接SQL和使用filter的不同

在寫sql語句時如: with adoquery1 do begin close; sql.clear; sql.add('select * from tb where dt > '+ch+'2008-10-10 10:10:10'+ch); open; end; 上面

Spring-Data-JPA 用Specification進行動態SQL查詢

1.定義一個繼承JpaSpecificationExecutor的介面 public interface UserDao extends JpaRepository<User, Integer>,JpaSpecificationExecutor<User&

模糊查詢--視圖sql

其他 sql 中文名 ble domain case when val 搜索 cal 《1》cip_admin_domain(option字段A) ---> 裏面配置(option字段A)屬性,defalut_value設置初始值(如:創建新項目,其創建後的項目狀態

[Spinr+MyBatis配置]為什麼可以DAO層只介面不用實現類

以下內容來源:https://www.cnblogs.com/soundcode/p/6497291.html,本文只做記錄。 根據網上的一些知識點,講一下原理: mybatis通過JDK的動態代理方式,在啟動載入配置檔案時,根據配置mapper的xml去生成Dao的實現。 sessio

MyBatis動態SQL(認真看看 以後SQL就爽多了)

MyBatis 令人喜歡的一大特性就是動態 SQL。 在使用 JDBC 的過程中, 根據條件進行 SQL 的拼接是很麻煩且很容易出錯的。 MyBatis 動態 SQL 的出現, 解決了這個麻煩。 MyBatis通過 OGNL 來進行動態 SQL 的使用的。 目前, 動態 SQL 支援以下幾種標籤

使用$符號進行模糊查詢不用#

<select id="queryAllVideo" resultMap="BaseResultMap" parameterType="String"> select v.*,u.face_image as face_image,u.nickname as nickname

spring 面向切面程式設計在執行SQL時列印類名及方法名

需求:在所有列印SQL語句前,加上SQL所在的類名及方法名。 解決方法:使用spring面向切面程式設計。 具體程式碼: package com.hys.qiantai.struts.action.

QQA: Spring Data 如何查詢屬性是否在列表中

每篇文章有多個標籤,選中多個標籤,要求找出含有該標籤的文章。同時如果選中標籤為空,則返回所有文章。Spring Data/JPA 如何實現? 可以使用 Spring Data Specification 動態建立查詢語句,最終結果如下: public interface PostRepository exte

Spring MongoTemplate複雜查詢分頁排序

Query query = Query.query(Criteria.where("sysName").is(Constant.SYS_TYPE_PORTAL).and("userName").is(account)).limit(5).with(new Sort(Dire

使用Spring訪問Mongodb的方法大全——Spring Data MongoDB查詢指南

1.概述 Spring Data MongoDB 是Spring框架訪問mongodb的神器,藉助它可以非常方便的讀寫mongo庫。本文介紹使用Spring Data MongoDB來訪問mongodb資料庫的幾種方法: 使用Query和Criteria類 JPA自動生成的查詢方法

spring data neo4j 查詢超時問題

使用sdn查詢時,當資料量較大並且需要做全庫掃描時,很容易出現超時問題。丟擲如下異常: Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.ne

解決spring整合mybatis後無法列印SQL語句的問題

網上說mybatis的早前版本配置列印sql還比較簡單,在3.0.6之後配置方式修改了。現在的spring-mybatis.xml配置如下:<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSession

springboot搭建整合mongoDB——MongoRepository簡單查詢MongoTemplate複雜查詢和分散式搭建

安裝我參考的是這兩篇部落格 如果你想要有mongodb的視覺化工具,可以從這個部落格Navicat Premium 12破解方法知道。 開始正餐 專案結構是 pom.xml <?xml version="1.0" encoding="UTF-8

Spring Data JPA查詢關鍵字

        Spring Data JPA使用方法名可解決大部分的查詢問題,但是也存在不能解決所有問題,以下是方法名中支援的關鍵字: 關鍵字 示例 JPQL 片段 And findByL

介紹 複雜查詢包括多表關聯分頁排序等

本篇進行Spring-data-jpa的介紹,幾乎涵蓋該框架的所有方面,在日常的開發當中,基本上能滿足所有需求。這裡不講解JPA和Spring-data-jpa單獨使用,所有的內容都是在和Spring整合的環境中實現。如果需要了解該框架的入門,百度一下,很多入門的介紹。在這篇文章的接下來一篇,會有一個

使用spring data jpa時自動注入dao層報錯

報錯內容: org.springframework.beans.factory.BeanCreationException: Could not autowire field NoSuchBeanDefinitionException: No qualify