Saltar al contenido

Cómo agregar un método personalizado a Spring Data JPA

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 llamarse AccountRepositoryCustomImplel nombre de la interfaz personalizada más Impl
  • No puede usar la inyección de constructor, solo @Autowiredque 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *