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
,countXXBy
, getXXBy
後面跟屬性名稱:
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