Estoy tratando de usar la proyección de Spring JPA para filtrar datos innecesarios del resultado de la consulta. Sin embargo, tengo varias proyecciones que deberán usarse en el mismo método de interfaz.
El problema es que estoy tratando de consultar datos del mismo método con un objeto de retorno diferente, pero Java no lo permite.
JPA genera automáticamente la consulta en función del nombre del método, por lo que no puedo realizar cambios en el nombre del método.
¿Hay alguna alternativa, además de crear una nueva interfaz, ya que creo que es una molestia e innecesaria?
aquí hay un código de muestra, de lo que estoy tratando de hacer.
Consulta generada automáticamente
public interface UserRepository extends CrudRepository<UserAccount, Long> { AuthenticateProjection getByUsername(String username); UserDetailsProjection getByUsername(String username); }Proyecciones
public interface AuthenticateProjection { @Value("#{target.username}") String getUsername(); @Value("#{target.credentail.token}") String getHashPassword(); } public interface UserDetailsProjection { @Value("#{target.username}") String getUsername(); @Value("#{target.firstname}") String getFirstName(); @Value("#{target.lastname}") String getLastName(); }Así que me las arreglé para descubrir cómo usar múltiples proyecciones con una sola consulta.
<T> T getByUsername(String username, Class<T> projection)Esto permite que la persona que llama al método especifique el tipo de proyección que se aplicará a la consulta.
Para mejorar esto aún más para que sea menos propenso a errores, hice una interfaz en blanco que la proyección tendrá que extender para poder insertar la clase en el parámetro.
public interface JPAProjection { } public interface UserRepository extends CrudRepository<UserAccount, Long> { <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection); }Interfaz de proyección
public interface UserDetailsProjection extends JPAProjection{ @Value("#{target.username}") String getUsername(); @Value("#{target.firstname}") String getFirstname(); @Value("#{target.lastname}") String getLastname(); }Entonces puedo llamar al método de consulta por
getByUsername("...", UserDetailsProjection.class)Simplemente agregue algo entre get (o, By ejemplo, find ) y comenzando con un carácter en mayúscula. Se ignora en la generación de la consulta.
public interface UserRepository extends CrudRepository<UserAccount, Long> { AuthenticateProjection getByUsername(String username); UserDetailsProjection getAnotherByUsername(String username); }