Chủ đề của HSF302 - Làm việc với Spring Framework

HSF302 - Phần 4: Truy cập dữ liệu với Spring Data JPA

Danh sách hàng nghìn dòng được trả về từng trang nhờ tham số Pageable, kèm Sort để định thứ tự, và kết quả là một Page biết cả tổng số trang lẫn tổng số phần tử. Tất cả bắt đầu từ một interface kế thừa JpaRepository với kiểu thực thể và kiểu khoá: không viết lớp cài đặt nào, Spring Data tự sinh đối tượng proxy có sẵn save, findById, findAll và deleteById. Truy vấn khó diễn đạt bằng tên được viết thẳng bằng JPQL hoặc SQL gốc trong @Query, tham số gắn bằng @Param, còn câu UPDATE hay DELETE cần thêm @Modifying. Với truy vấn đơn giản, chỉ tên phương thức là đủ: findByEmailAndStatus hay countByCategory được tách thành điều kiện WHERE theo tên thuộc tính của thực thể. Các thực thể mà những truy vấn này đọc ghi được ánh xạ ở Phần 1.

Xem danh sách câu hỏi15 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

15Câu hỏi hiện có

Câu hỏi của chủ đề

15/15 câuHết danh sách
AlookupByEmailLikeIgnoreCase(String email)
BfindByEmailContainingIgnoreCase(String email)
CqueryWhereEmailContainsCaseInsensitive(String email)
DselectEmailContainsIgnoreCase(String email)
Lời giải
Đáp án đúng: "findByEmailContainingIgnoreCase(String email)". Spring Data JPA phân tích tên phương thức: tiền tố findBy mở phần điều kiện, Email là thuộc tính của entity, từ khoá Containing sinh điều kiện LIKE có ký tự đại diện ở hai đầu giá trị, còn IgnoreCase bọc cả hai vế bằng UPPER để so không phân biệt hoa thường. "lookupByEmailLikeIgnoreCase(String email)" sai vì lookup không phải tiền tố hợp lệ (chỉ có find, read, get, query, search, stream, count, exists, delete), và Like không tự thêm ký tự đại diện nên người gọi phải tự truyền dấu phần trăm. "queryWhereEmailContainsCaseInsensitive(String email)" sai vì thiếu chữ By ngăn tiền tố với điều kiện, còn Where và CaseInsensitive không phải từ khoá, nên dù Contains là đồng nghĩa của Containing thì tên vẫn không phân tích được. "selectEmailContainsIgnoreCase(String email)" sai vì select không phải tiền tố hợp lệ và cũng thiếu By, Spring Data coi cả chuỗi là tên thuộc tính không tồn tại.
Mở trang câu hỏi này →
2Spring Data JPA is built on top of:4 lựa chọn
ASpring MVC
BSpring Core
CJPA
DServlets
Lời giải
Đáp án đúng: "JPA". Spring Data JPA là một module của dự án Spring Data, xây trên đặc tả JPA (Jakarta Persistence API): nó không tự ánh xạ đối tượng sang bảng mà dùng EntityManager của một JPA provider như Hibernate bên dưới, rồi bổ sung các repository như JpaRepository, sinh truy vấn từ tên phương thức và @Query để bớt mã lặp. Vì thế nền móng trực tiếp mà nó dựa vào là JPA. "Spring MVC" là framework web xử lý yêu cầu HTTP; Spring Data JPA dùng được cả trong ứng dụng không có web nên không phụ thuộc vào nó. "Spring Core" cung cấp container IoC mà mọi module Spring đều cần, nên Spring Data JPA đúng là chạy trong đó, nhưng câu hỏi nhắm tới công nghệ truy cập dữ liệu mà nó trừu tượng hoá. "Servlets" là API web của Jakarta EE, không liên quan tới tầng lưu trữ.
Mở trang câu hỏi này →
AJpaRepository
BCrudService
CEntityManager
DJdbcTemplate
Lời giải
Đáp án đúng: "JpaRepository". JpaRepository là interface của Spring Data JPA, kế thừa các interface CRUD và phân trang của Spring Data, nên khi khai báo một interface mở rộng JpaRepository cho thực thể Student với khoá Long, Spring tự sinh hiện thực có sẵn save, findById, findAll, deleteById, count cùng phân trang, sắp xếp và flush. "CrudService" không phải interface có trong Spring, chỉ là tên tự đặt. "EntityManager" là API của JPA có persist, find, merge, remove, tức làm được CRUD, nhưng đó là đối tượng quản lý persistence context ở tầng thấp, không phải interface repository cung cấp sẵn thao tác CRUD theo kiểu Spring Data. "JdbcTemplate" là lớp tiện ích của Spring JDBC để chạy câu SQL tự viết, không phải interface và không có sẵn phương thức CRUD theo thực thể.
Mở trang câu hỏi này →
AsearchBy
BfindBy
CgetWhere
DqueryFor
Lời giải
Đáp án đúng: "findBy". Trong Spring Data, chỉ cần khai báo phương thức như findByLastName(String lastName) trong interface kế thừa JpaRepository, bộ phân tích tên sẽ tách tiền tố findBy, nhận LastName là thuộc tính của entity và sinh truy vấn lọc theo cột tương ứng; findBy là tiền tố thông dụng nhất và được tài liệu Spring Data dùng làm ví dụ chuẩn cho derived query (truy vấn suy từ tên phương thức). "searchBy" thực ra cũng được các phiên bản Spring Data mới chấp nhận như một đồng nghĩa, nhưng ít dùng và không phải từ khoá tiêu biểu mà câu hỏi nhắm tới. "getWhere" sai vì thiếu By: get là tiền tố hợp lệ nhưng phải viết getBy, còn Where không phải từ khoá nên tên không được phân tích. "queryFor" sai tương tự, query chỉ hợp lệ khi đi cùng By, phần For không có nghĩa trong cú pháp này.
Mở trang câu hỏi này →
Apersist()
Binsert()
Csave()
Dupdate()
Lời giải
Đáp án đúng: "save()". JpaRepository kế thừa CrudRepository nên có save(S entity); cài đặt mặc định SimpleJpaRepository kiểm tra entity mới hay cũ (thường dựa vào id null hoặc trường @Version): entity mới thì gọi entityManager.persist để INSERT, entity đã có thì gọi entityManager.merge để UPDATE, rồi trả về thực thể đang được quản lý. "persist()" là phương thức của EntityManager trong JPA thuần, chỉ dùng cho entity mới và không nằm trong interface JpaRepository. "insert()" không tồn tại trong JpaRepository; Spring Data không tách riêng thao tác chèn. "update()" cũng không phải phương thức của JpaRepository; muốn cập nhật thì sửa entity rồi gọi save, hoặc viết phương thức có @Modifying kèm @Query.
Mở trang câu hỏi này →
AAutomatic repository implementation generation.
BSupport for JavaScript front-end development.
CBuilt-in load balancing.
DReal-time video streaming.
Lời giải
Đáp án đúng: "Automatic repository implementation generation.". Điểm mạnh then chốt của Spring Data JPA là lập trình viên chỉ cần khai báo một interface kế thừa JpaRepository hay CrudRepository, Spring tự sinh lớp hiện thực lúc chạy, có sẵn save, findById, findAll, delete, và còn tự suy câu truy vấn từ tên phương thức như findByEmail hay findByAgeGreaterThan, nhờ vậy gần như không phải viết DAO thủ công. "Support for JavaScript front-end development." không thuộc phạm vi Spring Data JPA, đây là thư viện truy cập dữ liệu phía server. "Built-in load balancing." là việc của hạ tầng như Spring Cloud LoadBalancer hay bộ cân bằng tải, không phải tầng repository. "Real-time video streaming." hoàn toàn không liên quan tới truy cập cơ sở dữ liệu quan hệ.
Mở trang câu hỏi này →
AReduced boilerplate code for data access.
BEnhanced security for front-end applications.
CSimplified network configuration.
DImproved performance for video encoding.
Lời giải
Đáp án đúng: "Reduced boilerplate code for data access.". Spring Data JPA cho phép chỉ khai báo một interface kế thừa JpaRepository, Spring tự sinh hiện thực lúc chạy với sẵn các thao tác CRUD, phân trang, sắp xếp, còn suy ra truy vấn từ tên phương thức như findByEmail hoặc nhận JPQL qua @Query; nhờ vậy bỏ được phần lớn mã lặp lại (boilerplate) như tự viết DAO, gọi EntityManager, dựng truy vấn. "Enhanced security for front-end applications." sai vì bảo mật thuộc Spring Security, và Spring Data JPA chạy ở phía server, không liên quan giao diện front-end. "Simplified network configuration." sai vì nó không cấu hình mạng; kết nối cơ sở dữ liệu vẫn do DataSource đảm nhận. "Improved performance for video encoding." hoàn toàn ngoài phạm vi, Spring Data JPA chỉ lo truy cập dữ liệu qua JPA.
Mở trang câu hỏi này →
AfindAllSortByLastNameAsc()
BfindByOrderLastNameAsc()
CfindByAgeGreaterThanOrderByLastNameAsc(int age)
DorderByLastNameAscFindAll()
Lời giải
Đáp án đúng: "findByAgeGreaterThanOrderByLastNameAsc(int age)". Cú pháp derived query của Spring Data là tiền tố kết thúc bằng By, tiếp theo là điều kiện, rồi mệnh đề OrderBy kèm thuộc tính và Asc hoặc Desc ở cuối; tên này phân tích thành lọc age lớn hơn tham số và sắp theo lastName tăng dần. Tên này còn lọc thêm theo age chứ không chỉ sắp xếp, nhưng nó là tên duy nhất hợp lệ trong số được đưa ra vì OrderBy đứng sau điều kiện và có đủ chữ By, và kết quả vẫn sắp theo lastName tăng dần như câu hỏi yêu cầu. "findAllSortByLastNameAsc()" sai vì Sort không phải từ khoá: bộ phân tích coi LastNameAsc là điều kiện lọc theo thuộc tính lastNameAsc không tồn tại. "findByOrderLastNameAsc()" sai vì thiếu By sau Order nên OrderLastNameAsc bị coi là tên thuộc tính. "orderByLastNameAscFindAll()" sai vì không mở bằng tiền tố như find, và mệnh đề sắp xếp phải nằm cuối.
Mở trang câu hỏi này →
Đề bài
List<Entity> findByPropertyOrderByPropertyAsc(String property);

do?

AFinds entities where property is equal to String property, ordered by property descending.
BFinds entities where property is equal to String property, ordered by property ascending.
CFinds entities where property contains String property, ordered by property ascending.
DFinds entities where property is less than String property, ordered by property ascending.
Lời giải
Đáp án đúng: "Finds entities where property is equal to String property, ordered by property ascending.". Spring Data JPA phân tích tên phương thức để sinh truy vấn: tiền tố findBy mở phần điều kiện, Property không đi kèm từ khoá nào nên mặc định là phép so sánh bằng với tham số String property, còn OrderByPropertyAsc thêm mệnh đề sắp xếp tăng dần theo chính thuộc tính đó; truy vấn tương đương là WHERE property = ?1 ORDER BY property ASC, trả về List các entity. "Finds entities where property is equal to String property, ordered by property descending." sai ở chiều sắp xếp, vì Asc là tăng dần, muốn giảm dần phải viết Desc. "Finds entities where property contains String property, ordered by property ascending." cần từ khoá Containing trong tên, như findByPropertyContaining, để sinh LIKE có ký tự đại diện hai đầu. "Finds entities where property is less than String property, ordered by property ascending." cần từ khoá LessThan, như findByPropertyLessThan.
Mở trang câu hỏi này →
AA single monolithic library that replaces JPA
BAn umbrella project containing multiple modules for different data stores and data-access styles
CA JDBC driver for all relational databases
DA GUI client for managing databases
Lời giải
Đáp án đúng: "An umbrella project containing multiple modules for different data stores and data-access styles". Spring Data là dự án ô (umbrella project) gồm nhiều mô-đun có chung mô hình lập trình repository: Spring Data JPA, Spring Data JDBC, Spring Data MongoDB, Spring Data Redis, Spring Data Elasticsearch và nhiều mô-đun khác, mỗi cái dành cho một kiểu kho dữ liệu, cả quan hệ lẫn NoSQL, đồng bộ hay reactive, nhưng đều cung cấp interface repository, suy truy vấn từ tên phương thức và phân trang. "A single monolithic library that replaces JPA" sai hai chỗ: Spring Data không phải một thư viện đơn khối, và Spring Data JPA chạy trên JPA chứ không thay JPA, vẫn cần Hibernate làm provider. "A JDBC driver for all relational databases" sai vì driver JDBC do từng nhà cung cấp cơ sở dữ liệu phát hành. "A GUI client for managing databases" sai vì Spring Data là thư viện cho mã nguồn, không phải công cụ đồ hoạ như pgAdmin hay MySQL Workbench.
Mở trang câu hỏi này →
11What best describes Spring Data JPA?4 lựa chọn
AA NoSQL database engine
BA higher-level abstraction on top of JPA that simplifies repository-based data access
CA replacement for the Spring Framework core container
DA message broker for JMS-based applications
Lời giải
Đáp án đúng: "A higher-level abstraction on top of JPA that simplifies repository-based data access". Spring Data JPA nằm trên JPA và provider như Hibernate: ta chỉ khai báo interface kế thừa JpaRepository, Spring tự sinh cài đặt lúc chạy với sẵn save, findById, findAll, phân trang, sắp xếp, và suy truy vấn từ tên phương thức hoặc @Query, nên không phải tự viết mã EntityManager lặp lại. "A NoSQL database engine" sai vì nó không phải cơ sở dữ liệu mà là thư viện truy cập dữ liệu, làm việc với cơ sở dữ liệu quan hệ qua JPA (kho NoSQL có các mô-đun Spring Data khác như Spring Data MongoDB). "A replacement for the Spring Framework core container" sai vì nó dựa vào chính IoC container để đăng ký repository làm bean chứ không thay thế container. "A message broker for JMS-based applications" sai vì môi giới thông điệp là việc của ActiveMQ hay RabbitMQ, không liên quan tới truy cập dữ liệu.
Mở trang câu hỏi này →
AJPQL
BSQL-92 only
CHQL only
DNative database-specific SQL
Lời giải
Đáp án đúng: "JPQL". Trong Spring Data JPA, chuỗi trong @Query mặc định được hiểu là JPQL (Java Persistence Query Language), ngôn ngữ truy vấn hướng đối tượng của JPA viết theo tên thực thể và tên trường, ví dụ select u from User u where u.email = :email, rồi nhà cung cấp JPA dịch sang SQL của cơ sở dữ liệu đang dùng. "Native database-specific SQL" chỉ được dùng khi khai báo tường minh nativeQuery = true, lúc đó câu lệnh viết theo tên bảng và cột thật. "HQL only" sai vì HQL là ngôn ngữ riêng của Hibernate; Hibernate chấp nhận JPQL như một tập con của HQL, nhưng @Query được định nghĩa theo JPQL để không phụ thuộc nhà cung cấp. "SQL-92 only" sai vì @Query mặc định không nhận SQL thuần theo chuẩn nào cả.
Mở trang câu hỏi này →
ATo manage user sessions.
BTo ensure data consistency by grouping database operations into a single unit.
CTo handle file uploads.
DTo create REST endpoints.
Lời giải
Đáp án đúng: "To ensure data consistency by grouping database operations into a single unit.". @Transactional gom các thao tác cơ sở dữ liệu trong một phương thức thành một giao dịch nguyên tử: hoặc tất cả cùng được commit, hoặc khi có RuntimeException thì tất cả bị rollback, ví dụ chuyển tiền gồm trừ tài khoản này và cộng tài khoản kia không thể chỉ xong một nửa. Trong Spring Data JPA, các phương thức của SimpleJpaRepository đã mặc định có @Transactional, phương thức đọc ở chế độ readOnly, còn ở tầng service ta tự đặt để nhiều lời gọi repository chung một giao dịch và một persistence context. "To manage user sessions." là việc của HttpSession hay Spring Session, không liên quan tới giao dịch cơ sở dữ liệu. "To handle file uploads." do MultipartFile và MultipartResolver xử lý. "To create REST endpoints." là vai trò của @RestController kèm @GetMapping, @PostMapping.
Mở trang câu hỏi này →
AA relational database bundled with the JDK
BA JPA implementation that replaces the specification
CAn abstraction on top of JPA providers that simplifies data access and reduces boilerplate
DA testing framework for JPQL queries only
Lời giải
Đáp án đúng: "An abstraction on top of JPA providers that simplifies data access and reduces boilerplate". Spring Data JPA không phải một JPA provider mà là lớp trừu tượng đặt trên JPA và provider như Hibernate: ta chỉ khai báo interface kế thừa JpaRepository, Spring sinh cài đặt lúc chạy với sẵn save, findById, findAll, delete, phân trang, sắp xếp, cộng truy vấn suy ra từ tên phương thức như findByEmail và @Query, giảm hẳn mã lặp khi làm việc với EntityManager. "A relational database bundled with the JDK" sai vì nó không phải cơ sở dữ liệu, JDK cũng không kèm hệ quản trị quan hệ nào; cơ sở dữ liệu như MySQL hay H2 là thành phần riêng. "A JPA implementation that replaces the specification" sai vì cài đặt JPA là việc của Hibernate hay EclipseLink, và Spring Data JPA dựa trên đặc tả chứ không thay thế nó. "A testing framework for JPQL queries only" sai vì nó dùng cho mã truy cập dữ liệu thật trong ứng dụng, còn kiểm thử là việc của JUnit cùng @DataJpaTest.
Mở trang câu hỏi này →
ANoSQL databases.
BRelational databases using the Java Persistence API (JPA).
CMessage queues.
DCloud storage.
Lời giải
Đáp án đúng: "Relational databases using the Java Persistence API (JPA).". Spring Data JPA là mô-đun của họ Spring Data dành cho cơ sở dữ liệu quan hệ: nó dựa trên JPA (đặc tả ánh xạ đối tượng – quan hệ của Java) và provider như Hibernate để ánh xạ entity sang bảng, rồi bổ sung repository tự sinh, truy vấn suy từ tên phương thức, phân trang và auditing, giảm mạnh mã truy cập dữ liệu lặp lại. "NoSQL databases." sai vì kho NoSQL có các mô-đun riêng như Spring Data MongoDB hay Spring Data Redis, không đi qua JPA. "Message queues." sai vì hàng đợi thông điệp dùng Spring AMQP, Spring for Apache Kafka hoặc JMS. "Cloud storage." sai vì lưu trữ đám mây như S3 dùng SDK của nhà cung cấp hoặc Spring Cloud AWS, nằm ngoài phạm vi Spring Data JPA.
Mở trang câu hỏi này →

Đề có câu hỏi của chủ đề này

5 đề chứa ít nhất một câu thuộc chủ đề — mở đề để làm cả bộ, không chỉ từng câu.