在使用Spring Data JPA nativeQuery时,如何使用参数中的值替换表名

时间:2016-12-04 06:18:20

标签: java spring spring-data-jpa nativequery

像这样:

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;包围。

5 个答案:

答案 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;
    }
}