解決使用springboot+ jpa + @query原生sql查詢,無法動態插入表名的問題

問題描述:

在使用springboot2.0 + jpa+ @query原生sql查詢時,無法動態插入表名

public interface BalanceTargetInfoRepositoryWithNativeQuery extends JpaRepository<BalanceTargetInfoBean, Long> {


    /**
     *  不能使用,問題:動態傳入表名,會在拼接sql時帶單引號,導致sql執行失敗
     * @param memberId
     * @return
     */
    @Query(nativeQuery = true,value = " SELECT " +
            "id AS targetId, " +
            "state AS state,\n" +
            "reduce AS reduce,\n" +
            "end_date AS endDate,\n" +
            "start_date AS startDate,\n" +
            "target_name AS targetName,\n" +
            "target_value AS targetValue,\n" +
            "complete_rate AS completeRate,\n" +
            "current_value AS currentValue,\n" +
            "DATEDIFF(end_date, CURRENT_DATE()) AS remainingDay,\n" +
            "notification AS notification FROM :tableName\n" +
            "WHERE member_id = :memberId\n" +
            "ORDER BY update_time DESC;")
    List<Object[]> getTarget(@Param("tableName")String tableName, @Param("memberId")long memberId);

}

使用 ?1傳遞表名也是報下面的錯誤。會自動給表名添加單引號,導致sql無法執行。 

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''target_info_0'
WHERE member_id = 7387250

解決:使用實體管理器EntityManager

@Component
public class BalanceTargetInfoRepository {
    //注入的是實體管理器,執行持久化操作
    @PersistenceContext 
    EntityManager entityManager;

    public  List<Object[]> getTarget(String tableName, long memberId){
        String sql=" SELECT " +
                "id AS targetId, " +
                "state AS state,\n" +
                "reduce AS reduce,\n" +
                "end_date AS endDate,\n" +
                "start_date AS startDate,\n" +
                "target_name AS targetName,\n" +
                "target_value AS targetValue,\n" +
                "complete_rate AS completeRate,\n" +
                "current_value AS currentValue,\n" +
                "DATEDIFF(end_date, CURRENT_DATE()) AS remainingDay,\n" +
                "notification AS notification FROM "+tableName+" WHERE member_id ="+memberId+" ORDER BY update_time DESC;";
        List<Object[]> list = entityManager.createNativeQuery(sql).getResultList();
        return list;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章