public interface XXXRepository extends CrudRepository<XXX, Integer> {
@Query(value = "select * from ?1 where ...", nativeQuery = true)
List<XXX> findByXXX(String tableName, ...);}
它使用代码提供MYSQL语法错误。 语法错误显示SQL中的表名称被&#34;&#39;&#34;&#34;包围。
答案 0 :(得分:4)
这是不可能的。参数仅允许在where子句中使用。
答案 1 :(得分:2)
如果您正在使用Spring Data存储库,则可以使用#{#entityName}
SpEL表达式作为实体名称的占位符。根据您的用例,不再需要使用实体名称作为方法参数。
我不确定当您使用nativeQuery = true
在此处查看文档:{{3}}
答案 2 :(得分:0)
您可以在jpa项目中使用entitymanger。
@Autowired EntityManager entityManager;
entityManager.createNativeQuery(&#34; select * from&#34; + tableName +&#34;&#34;)
答案 3 :(得分:0)
我有一个解决方法。
它使用javax.persistence.EntityManager和String.format来做到这一点。
package com.example.test.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import javax.persistence.EntityManager;
@Component
public class SomeDao {
@Autowired
EntityManager em;
public List<?> listFoodMoneyDateOfPayment(int departmentId, String sumKey, String tableName) {
String s = "SELECT SUM(%s) AS money, CONCAT(YEAR(apply_time), '-', MONTH(apply_time)) AS yearmonth " +
"FROM (%s) WHERE department_id = %d GROUP BY yearmonth";
String sql = String.format(s, sumKey, tableName, departmentId);
System.out.println(sql);
List<?> test = em.createNativeQuery(sql).getResultList();
return test;
}
}
调用代码是:
@RestController
@RequestMapping("/api")
public class TestController {
@Autowired
private SomeDao dao;
@RequestMapping("/test2")
public HttpEntity test2() {
var l = dao.listFoodMoneyDateOfPayment(12, "food_payment", "payment_application");
System.out.println(l.getClass());
System.out.println(JSON.toJSONString(l));
return ResultBean.success();
}
}
而且效果很好。
但是您应该检查传入的参数。
答案 4 :(得分:0)
jdbc 可以做到这一点:
@Autowired
JdbcTemplate jdbcTemplate;
public String nativeQueryToString(String query) {
try {
return jdbcTemplate.queryForObject(query, String.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}