java - que es spring data
¿Cómo crear consultas dinámicas con Spring Data Redis Repositories? (1)
Estoy probando Redis con spring-data-redis utilizando repositorios como este:
public interface CreditCardRepository extends CrudRepository<CreditCard, String>{
List<CreditCard> findByIssuer(String issuer);
List<CreditCard> findByCreditNetwork(String creditNetwork);
List<CreditCard> findByCreditNetworkAndIssuer(String creditNetwork, String issuer);
}
Los métodos anteriores consultarán sobre estructuras Redis como:
creditcard:creditNetwork:mastercard
creditcard:creditNetwork:visa
creditcard:issuer:company1
creditcard:issuer:company2
En este momento, mi objeto CreditCard contiene dos atributos (emisor, red y el id), por lo que es fácil buscar objetos como este:
private List<CreditCard> searchCardFromCache(CreditCardGetReq req) {
if (req.getIssuer() != null && req.getNetwork() != null) {
return ccRepository.findByIssuerAndCreditNetwork(req.getIssuer(), req.getNetwork().name());
}
if (req.getIssuer() != null) {
return ccRepository.findByIssuer(req.getIssuer());
}
if (req.getNetwork() != null) {
return ccRepository.findByCreditNetwork(req.getNetwork().name());
}
return null;
}
Sin embargo, no me gusta este código ya que tendré que crear una combinación de todas las propiedades y será muy complicado. En el futuro, planeo tener 15 propiedades para que la cadena ''si'' no sea posible.
Me gustaría preguntarle cómo puedo crear consultas dinámicas usando spring-data-redis, para que Redis pueda devolver la intersección en función de las propiedades del objeto de una manera mejor que verificando cada propiedad.
He intentado usar MethodHandle mediante hardcoding (eliminé previamente del repositorio findByIssuerAndCreditNetwork
) un nombre de método que sería dinámico generado así:
MethodType methodType = MethodType.methodType(cardList.getClass(), String.class, String.class);
// Dynamic create ''findByIssuerAndCreditNetwork''
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(CreditCardRepository.class, "findByIssuerAndCreditNetwork", methodType);
Pero parece que MethodHandle no funciona ya que obtuve el siguiente error:
java.lang.NoSuchMethodException: no existe dicho método: com.creditcard.dao.CreditCardRepository.findByIssuerAndCreditNetwork (String, String) ArrayList / invokeInterface
En este momento, no hay soporte para crear consultas dinámicas. Suena como si Query by Example pudiese ser lo que estás buscando. Spring Data MongoDB y Spring Data JPA ya implementan Query por ejemplo.
El módulo de almacenamiento de datos crea una consulta para que coincida con un objeto de dominio de ejemplo:
Person person = new Person();
person.setFirstname("Dave");
Example<Person> example = Example.of(person);
MongoRepository repo = …
List<Person> result = repo.findAll(example); // returns all objects that with Dave in firstname
Query por ejemplo no es compatible con Spring Data Redis en este momento, pero debería ser posible proporcionar soporte básico.
Creé un boleto DATAREDIS-605 para seguir el progreso de esta característica.