我正在开发的产品有80多个查找表,每个查找表都有自己的CRUD操作。我不想为每个模型创建单独的控制器和JPARepositories,但是我想使用一个控制器和一个通用的JPARepository来处理所有的查找表实体。Controller是一个@RestController,它接受JSON数据,需要有4个操作,即LIST,GET,POST和PUT。由于json数据格式相同,只涉及一个表,没有任何关系,我认为在Sprint Hibernate中一定可以实现这一点。谢谢你的建议
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> {
型}
1条答案
按热度按时间3bygqnnd1#
字符串
}
型
上面的引用是一种方式或通用实体类,可用于表示所有查找表。并创建一个扩展JPA存储库的通用存储库,将其注入控制器,并使用它执行查找实体的各种CRUD操作。
型
}