我試圖從RedShift使用Java + Hibernate卸載數據到S3,但無法弄清楚如何讓它接受字符串中的字符串SQL。Java,PostgreSQL和Hibernate:Select語句嵌套字符串
無論我嘗試使用正確傳遞給RedShift的引號字符的轉義序列,我只是在異常之後得到異常。
任何想法都會受到歡迎。謝謝。
這裏是我試圖在紅移運行查詢(如果我鍵入此直接進入紅移,它的工作原理):
unload ('select raw_line from stl_load_errors where starttime > \'2013-01-01\' ')
to 's3://myBucket/myTable/'
credentials 'aws_access_key_id=*;aws_secret_access_key=*' gzip;
這裏是我在Java中嘗試了各種命令,用錯誤我遇到:
單反斜線
session.createSQLQuery("unload ('select raw_line from stl_load_errors where starttime > \'2013-01-01\' ')"
+ " to 's3://myBucket/myTable/'"
+ " credentials 'aws_access_key_id=" + key + ";aws_secret_access_key=" + secret + "' gzip")
.executeUpdate();
成績
WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL錯誤:0,SQLState:42601
錯誤org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 錯誤:語法錯誤處於或接近「2013」位置:66
錯誤org.hibernate.exception.SQLGrammarException:無法執行語句
雙反斜線
session.createSQLQuery("unload ('select raw_line from stl_load_errors where starttime > \\'2013-01-01\\' ')"
+ " to 's3://myBucket/myTable/'"
+ " credentials 'aws_access_key_id=" + key + ";aws_secret_access_key=" + secret + "' gzip")
.executeUpdate();
成績
錯誤org.hibernate.QueryException:在參數前綴':'[unload('從stl_load_errors中選擇raw_line,其中starttime> \'2013-01-01 \'')'s3:// myBucket/myTable/「憑證 'aws_access_key_id = *; aws_secret_access_key = *' 的gzip]
在org.hibernate.engine.query.spi.ParameterParser.parse(ParameterParser.java:95)
三重反斜槓
session.createSQLQuery("unload ('select raw_line from stl_load_errors where starttime > \\\'2013-01-01\\\' ')"
+ " to 's3://myBucket/myTable/'"
+ " credentials 'aws_access_key_id=" + key + ";aws_secret_access_key=" + secret + "' gzip")
.executeUpdate();
結果
2013-06-19 01:39:59,233錯誤org.hibernate.QueryExceptio n:在參數前綴':'之後不允許空格:[unload('從stl_load_errors中選擇raw_line,其中starttime> \'2013-01-01 \'')爲's3:// myBucket/myTable /'憑證'aws_access_key_id = * ; aws_secret_access_key = *」的gzip]
在org.hibernate.engine.query.spi.ParameterParser.parse(ParameterParser.java:95)
四反斜槓
session.createSQLQuery("unload ('select raw_line from stl_load_errors where starttime > \\\\'2013-01-01\\\\' ')"
+ " to 's3://myBucket/myTable/'"
+ " credentials 'aws_access_key_id=" + key + ";aws_secret_access_key=" + secret + "' gzip")
.executeUpdate();
成績
WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL錯誤:0,SQLState:42601
錯誤org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 錯誤:在「2013」或其附近的語法錯誤位置:68
錯誤org.hibernate.exception。SQLGrammarException:無法執行語句
命名參數
session.createSQLQuery("unload (:query)"
+ " to 's3://myBucket/myTable/'"
+ " credentials 'aws_access_key_id=" + key + ";aws_secret_access_key=" + secret + "' gzip")
.setString("query", "select raw_line from stl_load_errors where starttime > '2013-01-01'")
.executeUpdate();
結果:
WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL錯誤:0,SQLSTATE:42601
錯誤org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 錯誤:語法錯誤或接近「$ 1」的位置:9
錯誤org.hibernate.exception.SQLGrammarException:無法執行語句
你是把密鑰和密碼不參數化,SQL注入攻擊,爲什麼不把日期參數化嗎? :日期:關鍵:祕密 – nachokk
如果我能得到任何的這個工作,我一定會清理(命名參數各地,這樣) – Tinclon