Spring Boot Repository中@Query动态传库名与Schema名失效求助
解决Spring Data JPA动态指定数据库和Schema的问题
你原来的写法行不通,是因为Spring Data JPA的参数绑定(:参数名)是用来替换SQL里的值的,不是用来替换数据库、Schema这类标识符的。它会把你传入的db和schema值加上单引号,最终生成的SQL会变成select * from 'db_name'.'schema_name'.Customer,这明显不符合SQL语法规则,自然执行失败。
下面给两种可行的解决方式:
方式一:用EntityManager手动构建SQL
直接通过EntityManager动态拼接SQL并执行,这种方式灵活可控:
@Repository public class CustomerCustomRepoImpl implements CustomerCustomRepo { @PersistenceContext private EntityManager entityManager; @Override public List<Entity> fetchEntities(String db, String schema) { // 拼接SQL,注意确保db和schema参数是可信的,避免SQL注入 String sql = String.format("select * from %s.%s.Customer", db, schema); Query query = entityManager.createNativeQuery(sql, Entity.class); return query.getResultList(); } }
需要先定义一个自定义接口:
public interface CustomerCustomRepo { List<Entity> fetchEntities(String db, String schema); }
然后让你的主Repository接口继承这个自定义接口:
public interface CustomerRepository extends JpaRepository<Entity, Long>, CustomerCustomRepo { // 其他Repository方法 }
方式二:使用SpEL表达式直接替换标识符
利用Spring的SpEL表达式在@Query里直接替换db和schema,这种写法更简洁,但要注意SQL注入风险,必须保证传入的db和schema参数是安全可信的:
@Query(value = "select * from #{#db}.#{#schema}.Customer", nativeQuery = true) List<Entity> fetchEntities(@Param("db") String db, @Param("schema") String schema);
这种方式会直接把参数值拼到SQL里,不会加单引号,能正确识别数据库和Schema标识符。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

