原創(chuàng)|行業(yè)資訊|編輯:龔雪|2016-07-21 11:43:43.000|閱讀 950 次
概述:我非常喜愛Spring Data JPA。它幫助我簡化代碼庫,把我從大量的JPAQL和SQL語句中解救出來。使用Spring Data編寫的復(fù)雜查詢也令我印象深刻。我最喜愛的功能便是從表格中返回第一條或頂部的記錄。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
我非常喜愛Spring Data JPA。它幫助我簡化代碼庫,把我從大量的JPAQL和SQL語句中解救出來。使用Spring Data編寫的復(fù)雜查詢也令我印象深刻。我最喜愛的功能便是從表格中返回第一條或頂部的記錄。
假設(shè)我有一個表格跟蹤文檔:
DOCUMENT_ID | NAME | VERSION |
1 | mydoc.doc | 1 |
2 | mydoc.doc | 2 |
3 | mydoc.doc | 3 |
與其關(guān)聯(lián)的JPA對象:
@Entity @Table(name = "DOCUMENT_TABLE") public class Document implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "DOCUMENT_ID") private Long documentId; @Basic(optional = false) @NotNull private String name; @Basic(optional = false) @NotNull private Long version; }
我的SQL會是這樣:
SELECT * FROM (SELECT * FROM document_table dt WHERE dt.name = 'mydoc.doc' ORDER BY dt.VERSION DESC ) WHERE rownum = 1;
或者在JPA中:
select d from Document d where d.name = :name and d.version = (select max(d.version) from Document d where d.name = :name)
但是我希望保持我的代碼庫始終不變,所以我要做的第一件事是:
public interface DocumentRepository extends CrudRepository { List findByNameOrderByVersionDesc(String name); }
我可以得到第一條記錄:
List documentList = documentRepository.findByNameOrderByVersionDesc("mydoc.doc"); Document document = documentList.get(0);
另一種選擇是在存儲庫中直接進行SQL查詢,但是最好的選擇還是使用 spring data中的TOP功能:
public interface DocumentRepository extends CrudRepository { Document findFirstByNameOrderByVersionDesc(String name); Document findTopByNameOrderByVersionDesc(String name); }
上述方法都是等效的
我們甚至可以使用TOP特性返回頂部的第n條記錄:
Document findTop2ByNameOrderByVersionDesc(String name);
有趣但意料之中的是,基礎(chǔ)的 SQL通過 Spring Data選擇中我在原始SQL語句中使用的rownum構(gòu)造生成。
本文譯自:Dzone 英文原文:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn