Escenario
En una aplicación Spring Boot v2.3.4 hay dos entidades Balance y Shop. Una tienda (shop) puede tener varios saldos y un saldo (Balance) ha de estar relacionado con una tienda. Además existen panaderías (Bakery) y sastrerías (TailorShop) que extienden la clase Shop:
1 2 3 4 5 6 7 8 9 |
@Entity public class Balance { @ManyToOne @JoinColumn(name = "shop_id") private Shop shop; ... } |
1 2 3 4 5 6 7 8 |
@Entity abstract public class Shop { @OneToMany(mappedBy = "shop") private Set<Balance> balances; ... } |
1 2 3 4 5 6 |
@Entity public class Bakery extends Shop { ... } |
1 2 3 4 5 6 |
@Entity public class TailorShop extends Shop { ... } |
Problema
Lo implemento con una interfaz de JpaRepository:
1 2 |
@Query(value = "SELECT MAX(b.closingDate) FROM Balance b WHERE TYPE(b.shop) = :className") LocalDate findMaxDateByShopClass(String className); |
Solución
Cambiar la consulta de la anotación para que haga un join con Shop antes de aplicar la condición:
1 2 |
@Query(value = "SELECT MAX(b.closingDate) FROM Balance b JOIN b.shop s WHERE TYPE(s) = :className") LocalDate findMaxDateByShopClass(String className); |