Truy vấn động MongoDB springboot

Gần đây, tôi gặp phải một vấn đề phức tạp khi tôi phải tạo một truy vấn động hoàn toàn. Vì việc tìm kiếm giải pháp hơi tốn thời gian, nên bạn nên viết về nó trong một bài báo chuyên dụng. Tôi hy vọng nó sẽ giúp người khác

Kịch bản

Xem xét tình huống sau

Bạn có một thực thể có 5 cột. Mệnh đề group by thay đổi tùy theo đầu vào của người dùng. Chẳng hạn, giả sử rằng có một giao diện người dùng nơi người dùng có thể chọn cột nào cần chọn và cách nhóm chúng

Ví dụ

Ví dụ về các cột được chọn bởi tác giả

Các trường màu xanh là do người dùng chọn

Giả sử rằng ứng dụng của bạn tạo truy vấn JPA sau. vấn đề với nó là gì?

select sr.user, sr.timestamp, sr.status, sr.date, sr.instances from SERVER_RECORD sr where sr.user = 'user123' group by sr.status;

Nó sẽ hiển thị lỗi nói rằng phần còn lại của các cột, cụ thể là "người dùng, dấu thời gian, ngày, phiên bản", không được bao gồm trong mệnh đề group by hoặc không được tổng hợp

Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

Tất cả các cột trong mệnh đề select không có aggregate cần phải ở phần group by

Trong bài đăng này, tôi sẽ chỉ cho bạn một cách để giải quyết vấn đề

Hướng dẫn này giả định rằng bạn đã quen thuộc với Java Persistence Criteria API

Hãy đi sâu vào nó

giải pháp dự án

Để minh họa tình huống, hãy tạo một ví dụ đơn giản. Hãy tưởng tượng rằng bạn muốn truy vấn các bản ghi từ một bảng có tên là SERVER_RECORD. Đây là lớp thực thể

Thực thể ServerRecord

Hãy đặt tên cho dịch vụ sẽ truy vấn dữ liệu

Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
0và lấy một phiên bản
Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
1

Tạo dịch vụ tìm bản ghi

Hãy viết một phương thức trả về các bản ghi

Phần đầu tiên của phương thức getRecords()

Vì chúng tôi không có giao diện người dùng nên chúng tôi sẽ mã hóa cứng đầu vào của người dùng cho mục đích demo

Phần chọn

  • Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
    2,
    Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
    3

Nhóm theo từng phần

  • Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
    4

Hãy xây dựng truy vấn

Phần thứ hai của phương thức getRecords()

Phần chọn lấy các cột đã chọn từ đầu vào của người dùng và đặt chúng vào danh sách

Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
5

Đó là nội dung của phương pháp

Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
6

  • Phương thức
    Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
    7 rất quan trọng — đây là cách chúng ta có thể tham chiếu đến các bí danh khi ánh xạ kết quả tới thực thể
  • Chúng tôi chuyển danh sách lựa chọn cho phương thức truy vấn
    Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
    8
  • Mệnh đề
    Column ‘{the column name}’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
    9 bổ sung vị ngữ cho mệnh đề
    java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)
    0. Trong ví dụ này, chúng tôi muốn truy vấn các bản ghi trong đó user=”xyz”
  • Trong phần truy vấn cuối cùng, chúng ta xây dựng mệnh đề group by. Lưu ý rằng chúng tôi kết hợp các giá trị group by với các giá trị select. Điều này đảm bảo rằng mỗi lựa chọn không có tổng hợp được bao gồm trong phần group by

Bây giờ là lúc để tạo một

java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)
5 và thực hiện nó

  • Phương thức
    java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)
    6 trả về một
    java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)
    7 chứa kết quả truy vấn
  • Tạo một phương thức mới để truy cập vào
    java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)
    8. Phương thức
    java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)
    9 thu thập tất cả các bí danh mà chúng ta đã xác định trước đó

Bây giờ, chúng ta có thể lặp lại kết quả truy vấn và ánh xạ nó tới thực thể

select sr.TIMESTAMP, sr.USER from SERVER_RECORD sr where sr.USER = 'xyz' group by sr.TIMESTAMP, sr.USER, sr.DATE;
0

Đây là giao diện của phương thức

select sr.TIMESTAMP, sr.USER from SERVER_RECORD sr where sr.USER = 'xyz' group by sr.TIMESTAMP, sr.USER, sr.DATE;
1

Bạn có thể tự hỏi mục đích của phương pháp này là gì. Hãy nhớ rằng chúng tôi đã xác định một danh sách động các lựa chọn cho mệnh đề select. Do đó, nó có thể không chứa tất cả các cột. Vì vậy, nếu bạn cố gắng sử dụng

select sr.TIMESTAMP, sr.USER from SERVER_RECORD sr where sr.USER = 'xyz' group by sr.TIMESTAMP, sr.USER, sr.DATE;
3 và nó không tồn tại, nó sẽ đưa ra một ngoại lệ như thế này

java.lang.IllegalArgumentException: Given alias [some alias] did not correspond to an element in the result tuple at org.hibernate.jpa.spi.CriteriaQueryTupleTransformer$TupleImpl.get(CriteriaQueryTupleTransformer.java:93)

Do đó, chúng ta chỉ cần đặt những giá trị có cột nằm trong tập hợp

select sr.TIMESTAMP, sr.USER from SERVER_RECORD sr where sr.USER = 'xyz' group by sr.TIMESTAMP, sr.USER, sr.DATE;
4. Nếu không, chúng tôi đặt giá trị thuộc tính thành
select sr.TIMESTAMP, sr.USER from SERVER_RECORD sr where sr.USER = 'xyz' group by sr.TIMESTAMP, sr.USER, sr.DATE;
5 để bỏ qua

Làm cách nào để thực thi truy vấn MongoDB trong Spring Boot?

2. 1 Bước#0. Thiết lập MongoDB với Spring Boot
2. 2 Bước #1. Tạo Dự án khởi động mùa xuân bằng STS (Bộ công cụ mùa xuân)
2. 3 Bước #2. Cập nhật ứng dụng. của cải
2. 4 Bước#3. Tạo lớp thực thể
2. 5 Bước #4. Tạo giao diện kho lưu trữ
2. 6 Bước #4. Lưu một số bản ghi vào MongoDB. 2. 6. 1 Đầu ra từ MongoDB

Làm cách nào để sử dụng chú thích @query trong khởi động mùa xuân với MongoDB?

Chú thích @Query khá đơn giản và dễ hiểu. @Query("mongo query") public List Khi phương thức findBy() được gọi, . Hãy nhớ rằng trong thời gian biên dịch, Spring Boot không biết trước loại truy vấn sẽ trả về.

Làm cách nào để lấy các trường cụ thể từ MongoDB trong Spring Boot?

Chỉ trả về các trường cụ thể cho một truy vấn trong Spring Data MongoDB .
Tổng quan. Khi sử dụng Spring Data MongoDB, chúng ta có thể cần hạn chế các thuộc tính được ánh xạ từ một đối tượng cơ sở dữ liệu. .
Hạn chế các trường MongoDB bằng phép chiếu. .
Thực hiện phép chiếu. .
Kiểm tra bằng MongoRepository và MongoTemplate. .
Phần kết luận

Làm cách nào để tham gia hai bộ sưu tập trong MongoDB bằng Spring Boot?

Để thực hiện MongoDB Tham gia hai bộ sưu tập, bạn phải sử dụng toán tử tra cứu $ . Nó được định nghĩa là một giai đoạn thực hiện nối ngoài bên trái với một bộ sưu tập khác và hỗ trợ lọc dữ liệu từ các tài liệu đã nối. Ví dụ: nếu người dùng yêu cầu tất cả các điểm từ tất cả học sinh, thì truy vấn bên dưới có thể được viết. Sinh viên.