BookRepository: embedded-path queries + record projection (with the nested-path projection corner case)

This commit is contained in:
2026-07-25 08:19:49 +00:00
parent 9d42a42d26
commit 0eaac42e01

View File

@@ -1,16 +1,29 @@
package com.ankurm.sdjpa4demo.repo;
import com.ankurm.sdjpa4demo.domain.Book;
import com.ankurm.sdjpa4demo.domain.BookSummary;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.math.BigDecimal;
import java.util.List;
public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findByPriceGreaterThanEqual(BigDecimal price);
// Embedded-value-object path traversal: price -> amount. Resolves to: where b.price.amount >= :min
List<Book> findByPriceAmountGreaterThanEqual(BigDecimal min);
// Single-result derived query that can match MORE than one row on bad data:
// Single-result derived query over an embedded path that can match MORE than one row on bad data:
// demonstrates IncorrectResultSizeDataAccessException (the "non-unique" edge case).
Book findByPrice(BigDecimal price);
Book findByPriceAmount(BigDecimal price);
// CORNER CASE: a derived-query class-based (record) projection matches constructor-parameter names
// against DIRECT entity properties only. BookSummary's "amount" component does not resolve against
// the nested b.price.amount path this way - PropertyReferenceException: No property 'amount' found
// for type 'Book' (verified by actually running the derived-method form before falling back to this).
// A @Query constructor expression works for nested/embedded paths; the derived-method-only form does not.
@Query("select new com.ankurm.sdjpa4demo.domain.BookSummary(b.title, b.price.amount) "
+ "from Book b where b.price.amount <= :max")
List<BookSummary> findByPriceAmountLessThanEqual(@Param("max") BigDecimal max);
}