java Spring Data通过其字段查找实体并进行反射

wfsdck30  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(81)

由于在许多服务类中有许多重复的代码,我决定将其移动到一个基本服务类中,然后重用它。

public class BaseService<ENTITY, ID> {

@Autowired
private BaseDao<ENTITY, ID> baseDao;

protected boolean isExist(ENTITY e) {
    Map<Field, Object> allValues = ReflectUtils.getAllValues(e);
    //...

}

}

isExist(ENTITY e)方法中,我想调用一个baseDao方法来查找一个实体(在运行时它必须知道确切的实体)并将allValues传递给它。基本上,我想知道是否可以使用Spring Data这样做smth:

public interface BaseDao<ENTITY, ID> extends JpaRepository<ENTITY, ID> {

Optional<ENTITY> findByFields(Map<Field, Object> allValues);
}
ejk8hzay

ejk8hzay1#

你不能通过提供Map参数给一个repository方法来做到这一点,但是可以通过将反射方法与spring的Query By Example API相结合来实现。简化示例:

public <Entity> Optional<Entity> findByFields(Map<Field, Object> allValues) throws IllegalAccessException {
  Entity entity = create an instance;
  for (Map.Entry<Field, Object> entry : allValues.entrySet()) {
    //allow access to the field
    entry.getKey().set(entity, entry.getValue());
    //restore access to previous state
  }
  Example<Entity> example = Example.of(entity);
  return queryByExampleExecutor.findOne(example);
}

可能有用的问题:

  1. Set field value with reflection
  2. Spring Data JPA: Query by Example?

相关问题