Este team de especialistas despúes de algunos días de investigación y recopilar de datos, hemos dado con la respuesta, deseamos que te sea de gran utilidad para tu trabajo.
Solución:
Debe crear una interfaz separada para sus métodos personalizados:
public interface AccountRepository
extends JpaRepository, AccountRepositoryCustom ...
public interface AccountRepositoryCustom
public void customMethod();
y proporcione una clase de implementación para esa interfaz:
public class AccountRepositoryImpl implements AccountRepositoryCustom
@Autowired
@Lazy
AccountRepository accountRepository; /* Optional - if you need it */
public void customMethod() ...
Ver también:
-
4.6 Implementaciones personalizadas para repositorios de datos Spring
-
Tenga en cuenta que el esquema de nombres ha cambiado entre versiones. Consulte https://stackoverflow.com/a/52624752/66686 para obtener más detalles.
Además de la respuesta de axtavt, no olvide que puede inyectar Entity Manager en su implementación personalizada si lo necesita para crear sus consultas:
public class AccountRepositoryImpl implements AccountRepositoryCustom
@PersistenceContext
private EntityManager em;
public void customMethod()
...
em.createQuery(yourCriteria);
...
La respuesta aceptada funciona, pero tiene tres problemas:
- Utiliza una característica de Spring Data no documentada cuando nombra la implementación personalizada como
AccountRepositoryImpl
. La documentación establece claramente que tiene que llamarseAccountRepositoryCustomImpl
el nombre de la interfaz personalizada másImpl
- No puede usar la inyección de constructor, solo
@Autowired
que se consideran malas prácticas - Tiene una dependencia circular dentro de la implementación personalizada (es por eso que no puede usar la inyección del constructor).
Encontré una manera de hacerlo perfecto, aunque no sin usar otra característica de Spring Data no documentada:
public interface AccountRepository extends AccountRepositoryBasic,
AccountRepositoryCustom
public interface AccountRepositoryBasic extends JpaRepository
// standard Spring Data methods, like findByLogin
public interface AccountRepositoryCustom
public void customMethod();
public class AccountRepositoryCustomImpl implements AccountRepositoryCustom
private final AccountRepositoryBasic accountRepositoryBasic;
// constructor-based injection
public AccountRepositoryCustomImpl(
AccountRepositoryBasic accountRepositoryBasic)
this.accountRepositoryBasic = accountRepositoryBasic;
public void customMethod()
// we can call all basic Spring Data methods using
// accountRepositoryBasic
Recuerda que puedes comunicar este artículo si si solucionó tu problema.