hibernate 有没有一种方法可以使用单个控制器和单个通用JPARepository来处理多个实体?

p5cysglq  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(111)

我正在开发的产品有80多个查找表,每个查找表都有自己的CRUD操作。
我不想为每个模型创建单独的控制器和JPARepositories,但是我想使用一个控制器和一个通用的JPARepository来处理所有的查找表实体。
Controller是一个@RestController,它接受JSON数据,需要有4个操作,即LIST,GET,POST和PUT。由于json数据格式相同,只涉及一个表,没有任何关系,我认为在Sprint Hibernate中一定可以实现这一点。
谢谢你的建议

3bygqnnd

3bygqnnd1#

@RestController
@RequestMapping("/lookup/{tableName}")
public class LookupController {

@Autowired
private GenericRepository repository;

@GetMapping
public List<?> list(@PathVariable String tableName) {
    return repository.findAll(tableName);
}

@GetMapping("/{id}")
public Object get(@PathVariable String tableName, @PathVariable Long id) {
    return repository.findById(tableName, id);
}

@PutMapping("/{id}")
public void update(@PathVariable String tableName, @PathVariable Long id, @RequestBody Object entity) {
    repository.save(tableName, entity);
}

@GetMapping("/findBy/{property}/{value}")
public List<?> findByProperty(@PathVariable String tableName, @PathVariable String property, @PathVariable String value) {
    return repository.findByProperty(tableName, property, value);
}

字符串
}

@Repository
public class GenericRepository {

@PersistenceContext
private EntityManager entityManager;

public List<?> findAll(String tableName) {
    return entityManager.createQuery("SELECT e FROM " + tableName + " e").getResultList();
}

public Object findById(String tableName, Long id) {
    return entityManager.find(tableName, id);
}

public void save(String tableName, Object entity) {
    entityManager.merge(entity);
}

public List<?> findByProperty(String tableName, String property, String value) {
    String query = "SELECT e FROM " + tableName + " e WHERE e." + property + " = :value";
    TypedQuery<?> typedQuery = entityManager.createQuery(query, Object.class);
    typedQuery.setParameter("value", value);
    return typedQuery.getResultList();
}


上面的引用是一种方式或通用实体类,可用于表示所有查找表。并创建一个扩展JPA存储库的通用存储库,将其注入控制器,并使用它执行查找实体的各种CRUD操作。

public interface GenericRepository <T, ID extends Serializable> extends JpaRepository<T, ID> {


}

相关问题