springframework - spring data jpa example mkyong
Obtenga el error "Consulta derivada no válida" por todas partes en nuestras interfaces Spring Data JpaRepository en STS 3.1 (4)
Hemos implementado nuestros repositorios exactamente como se muestra en la documentación de Spring Data. Todo estuvo bien hasta que pasamos de STS 2.9 a STS 3.1. Todos los intentos por hacer que estos errores desaparezcan han fallado, y en algunos casos ni siquiera tienen sentido! ¡No coinciden con ninguna propiedad ni en la interfaz ni en las entidades utilizadas!
Aquí hay un ejemplo:
public interface CreditNotesRepository extends JpaRepository<CreditNotes, Long> {
CreditNotes findCurrentCreditNotes(Long shipmentDetailId);
}
El findCurrentCreditNotes
es una consulta con nombre en nuestra entidad. Este código se ejecuta perfectamente bien.
@NamedQueries({
@NamedQuery(name = "CreditNotes.getCount", query = "SELECT COUNT(f) FROM CreditNotes f"),
@NamedQuery(name = "CreditNotes.findCurrentCreditNotes", query =
"SELECT creditNotes FROM CreditNotes creditNotes"
+ " WHERE creditNotes.shipmentDetail.shipmentDetailId = ?1 "
+ " AND creditNotes.notesSeqNumber = (SELECT max(creditNotes2.notesSeqNumber) FROM CreditNotes creditNotes2"
+ " WHERE creditNotes.shipmentDetail.shipmentDetailId = creditNotes2.shipmentDetail.shipmentDetailId)")
})
Y el error que obtenemos:
Invalid derived query! No property find found for type ca.cole.freight.model.CreditNotes
Aunque esto es solo una bandera (no afecta a la compilación), es molesto y confuso. ¿Alguien puede arrojar algo de luz sobre esto? ¡Y explícamelo como si tuviera 6 años! ;)
Acabo de pasar por esto yo mismo. Desafortunadamente, la implementación de Spring Data cambió entre 1.1 y 1.2. Ya no admite la declaración XML <repository>
. Puede configurar un postfijo personalizado, pero de forma predeterminada, espera un bean de nombre de clase <InterfaceName>Impl
. Si no puede encontrar la implementación del repositorio personalizado, comienza a recibir errores como el que está encontrando. Está intentando crear métodos para consultar objetos basados en nombres de métodos en su interfaz.
Una alternativa es hacer retroceder su versión de Spring Data a 1.1 y especificar una ubicación de esquema de http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd
en su XML.
En la post en el Foro de Primavera, el Equipo de Primavera anunció que
Ya está arreglado para STS 3.3.0
No he comprobado esta versión todavía. Pero estoy usando 3.5.0.RELEASE y el problema vuelve! Mi solución es desmarcar la consulta derivada no válida
Es un error IDE explicado en la siguiente publicación:
Mientras tanto, puede desactivar la validación en preferencias / spring / project validators / Data validator desmarcar la consulta derivada no válida y STS ya no lanzará el marcador.
También hay una solución para esto. Agregue la anotación @Query
en su definición de método en su repositorio sin una consulta de JPQL / SQL definida.
Aquí está el ejemplo:
@Query
List<OwnerModel> findByFirstNameAndAgeNotZero(@Param(value = "firstName") String firstName);
En este caso, se utilizará la consulta denominada OrderModel.findByFirstNameAndAgeNotZero
. Su error de Eclipse La Invalid derived query
válida también debería desaparecer sin necesidad de deshabilitar la validación como lo describe @Tuan Dang
Comprobado en Eclipse 4.5.1 con el complemento Spring instalado para @NamedQuery
y @NamedNativeQuery
.