Thiếu phương thức CrudRepository # findOne


101

Tôi đang sử dụng Spring 5 trong dự án của mình. Cho đến ngày hôm nay đã có phương pháp CrudRepository#findOne.

Nhưng sau khi tải xuống ảnh chụp nhanh mới nhất, nó đột nhiên biến mất! Có bất kỳ tài liệu tham khảo mà phương pháp không có sẵn bây giờ?

Danh sách người phụ thuộc của tôi:

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'


repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}    

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'

    runtime 'com.h2database:h2:1.4.194'
}

CẬP NHẬT:

Có vẻ như phương pháp này đã được thay thế bằng CrudRepository#findById

Câu trả lời:


150

Vui lòng xem DATACMNS-944 được liên kết với cam kết này có các tên sau

╔═════════════════════╦═══════════════════════╗
║      Old name       ║       New name        ║
╠═════════════════════╬═══════════════════════╣
║ findOne(…)          ║ findById(…)           ║
╠═════════════════════╬═══════════════════════╣
║ save(Iterable)      ║ saveAll(Iterable)     ║
╠═════════════════════╬═══════════════════════╣
║ findAll(Iterable)   ║ findAllById(…)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(ID)          ║ deleteById(ID)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(Iterable)    ║ deleteAll(Iterable)   ║
╠═════════════════════╬═══════════════════════╣
║ exists()            ║ existsById(…)         ║
╚═════════════════════╩═══════════════════════╝

1
Có hướng dẫn di chuyển nào mà tôi đã bỏ qua hay dòng mơ hồ này từ các ghi chú phát hành đều liên quan đến thông báo không? "DATAJPA-1104 - Thích ứng với các thay đổi API trong giao diện kho lưu trữ" Làm thế nào bạn tìm ra? :-)
Christian

2
Không chắc liệu đây có phải là bất kỳ hướng dẫn di chuyển nào hay không nhưng bạn có thể tìm thấy tham chiếu đến nó trong wiki đào tạo Kay ( github.com/spring-projects/spring-data-commons/wiki/… ) cũng như bảng thay đổi Spring Data Commons ( tài liệu .spring.io / lò xo dữ liệu / commons / docs / hiện tại / changelog.txt )
Sean Carroll

103

Lưu ý rằng đó findByIdkhông phải là một thay thế chính xác cho findOne, nó trả về Optionalthay vì null.

Không quen thuộc lắm với những thứ java mới, tôi phải mất một chút thời gian để tìm ra, nhưng điều này biến findByIdhành vi thành findOnemột:

return rep.findById(id).orElse(null);

1
Không phải là ý tưởng tốt nhất: mã của bạn sẽ tiếp tục hoạt động nhưng bạn không sử dụng API như bình thường . Optionalđã được thêm vào để làm sạch mã khỏi tất cả các lần nullkiểm tra. Chỉ cần thay đổi kiểu trả về của phương thức mà bạn và sử dụng Optionalnhư một tốt boy-trinh sát nên
GabiM

5
@GabiM Điều này sẽ thật tuyệt nếu bạn có quyền kiểm soát tất cả các phương thức ở phía dưới. Ngay cả khi bạn có quyền kiểm soát mọi thứ ở phần hạ lưu và dự án của bạn không phụ thuộc vào một số dự án của bên thứ ba khác, nếu các phương thức xuống mã cho null (như trong, tạo nếu không tồn tại hoặc thực hiện một số logic nếu thiếu), thì bạn có để sửa chữa chúng.
zeusalmighty

Tham chiếu đến liên kết từ @GabiM, tôi chỉ muốn chỉ ra rằng ngay cả liên kết đó cũng nói rằng "Điều quan trọng cần lưu ý là ý định của lớp Tùy chọn không phải để thay thế mọi tham chiếu rỗng"
Scott Carlson

32

Chúng tôi có hàng trăm cách sử dụng của findOne()phương pháp cũ . Thay vì bắt tay vào tái cấu trúc khổng lồ, chúng tôi đã kết thúc việc tạo giao diện trung gian sau và để các kho lưu trữ của chúng tôi mở rộng nó thay vì mở rộng JpaRepositorytrực tiếp

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 

Giải pháp hàng đầu cho tôi. Không cần đúc. return findById(id).orElse(null);đủ
Ken007

Hoàn toàn đồng ý. Đã lưu cho tôi hàng trăm dòng thay đổi.
Scott Carlson

7

Một sự biến đổi thực dụng

Cách cũ:

Entity aThing = repository.findOne(1L);

Cách mới:

Optional<Entity> aThing = repository.findById(1L);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.