最近項目資料庫用到mongodb,采用jpa查詢時碰到不少問題,查詢各資源均未找到好的解決方案,如無法搜尋數字等,以下為本人實作方式,寫出來給有需要的人!
以下為部分代碼,基礎部分大家應該都很清楚了
1、對查詢字元串轉義,以處理輸入為regex的特定字元(同時允許輸入以數字開頭的模糊查詢):
//regex對輸入特殊字元轉義
String escapeExprSpecialWord(String keyword) {
if (StringUtils.isNotBlank(keyword)) {
String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
for (String key : fbsArr) {
if (keyword.contains(key)) {
keyword = keyword.replace(key, "\\" + key);
}
}
}
return keyword;
}
//以下部分為controller及repository兩部分核心代碼,我是在controller中将查詢條件拼裝成criteria給service\repository處理
2、使用Criteria
//m.get("parma1")為前端傳入參數param1
Pattern pattern = Pattern.compile(".*?" + escapeExprSpecialWord(m.get("param1").toString()) + ".*");
Criteria criteria=Criteria.where("param1").regex(pattern);
pattern = Pattern.compile(".*?" + escapeExprSpecialWord(m.get("param2").toString()) + ".*");
criteria.and("param2").regex(pattern);
//
Query query = new Query(criteria);
// mongoTemplate.count計算總數
long total = mongoTemplate.count(query, Ticket.class);
List<MyEntity> items = mongoTemplate.find(query.with(pageable), MyEntity.class);
return new PageImpl(items, pageable, total);
3、對于子查詢elemmatch的處理
查詢各文章一直都未成功,不知道怎麼回事,我是采用以下方式解決:
- 映射類中按collection結構設定,對子集不要設定為map而是設定子類
- 查詢中直接使用a.b即可查詢
例:collection結構為{id:XXX,content:XXX,project:{id:XXX,name:XXX}}
@Document(collection="Ticket")
…………
public class Ticket extends BaseEntity implements java.io.Serializable {
@Id
private String id;
private String content;
private Project project; //定義Project類以比對collection中的project字段
……
}
class Location{
long id;
String name;
}
//查詢project.id=1的記錄
Criteria.where("project.id").is(1);
//查詢project.name包含武漢的記錄
Criteria.where("project.name").regex(".*?武漢.*"); //如從前端擷取有特定字元的查詢條件或以數字開頭的查詢條件請使用前面說的轉義方法處理