自定义方法
自定義方法
Spring Data 的另一個強大功能,是根據方法名稱自動實現功能。
比如:你的方法名叫做:findByTitle,那么它就知道你是根據title查詢,然后自動幫你完成,無需寫實現類。
當然,方法名稱要符合一定的約定:
| And | findByNameAndPrice | {"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
| Or | findByNameOrPrice | {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
| Is | findByName | {"bool" : {"must" : {"field" : {"name" : "?"}}}} |
| Not | findByNameNot | {"bool" : {"must_not" : {"field" : {"name" : "?"}}}} |
| Between | findByPriceBetween | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| LessThanEqual | findByPriceLessThan | {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| GreaterThanEqual | findByPriceGreaterThan | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
| Before | findByPriceBefore | {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| After | findByPriceAfter | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
| Like | findByNameLike | {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
| StartingWith | findByNameStartingWith | {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
| EndingWith | findByNameEndingWith | {"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}} |
| Contains/Containing | findByNameContaining | {"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}} |
| In | findByNameIn(Collection<String>names) | {"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}} |
| NotIn | findByNameNotIn(Collection<String>names) | {"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}} |
| Near | findByStoreNear | Not Supported Yet ! |
| True | findByAvailableTrue | {"bool" : {"must" : {"field" : {"available" : true}}}} |
| False | findByAvailableFalse | {"bool" : {"must" : {"field" : {"available" : false}}}} |
| OrderBy | findByAvailableTrueOrderByNameDesc | {"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}} |
例如,我們來按照價格區間查詢,定義這樣的一個方法:
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {/*** 根據價格區間查詢* @param price1* @param price2* @return*/List<Item> findByPriceBetween(double price1, double price2); }然后添加一些測試數據:
@Test public void indexList() {List<Item> list = new ArrayList<>();list.add(new Item(1L, "小米手機7", "手機", "小米", 3299.00, "http://image.learn.com/13123.jpg"));list.add(new Item(2L, "堅果手機R1", "手機", "錘子", 3699.00, "http://image.learn.com/13123.jpg"));list.add(new Item(3L, "華為META10", "手機", "華為", 4499.00, "http://image.learn.com/13123.jpg"));list.add(new Item(4L, "小米Mix2S", "手機", "小米", 4299.00, "http://image.learn.com/13123.jpg"));list.add(new Item(5L, "榮耀V10", "手機", "華為", 2799.00, "http://image.learn.com/13123.jpg"));// 接收對象集合,實現批量新增itemRepository.saveAll(list); }?
不需要寫實現類,然后我們直接去運行:
@Test public void queryByPriceBetween(){List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);for (Item item : list) {System.out.println("item = " + item);} }雖然基本查詢和自定義方法已經很強大了,但是如果是復雜查詢(模糊、通配符、詞條查詢等)就顯得力不從心了。此時,我們只能使用原生查詢。
總結
- 上一篇: 基本查询
- 下一篇: thymeleaf语法介绍