2013-08-30 36 views
1

當我通過psql運行下面的sql語句時,它工作正常,但是當我嘗試通過使用preparedstatement構建它時運行相同的查詢時,它失敗。通過JDBC插入時出錯

INSERT INTO Hvbp 
    (provider_number, weighted_clinical_process, 
    weighted_patience_experience, total_performance_score, 
    coordinates, latitude, longitude, address, city, state, zip) 
VALUES 
('010092', 43.909090909091, 13.5, 57.409090909091, 
'POINT(33.206201 -87.525480)', 33.206200613000476, 
-87.52548020899968, '809 UNIVERSITY BOULEVARD EAST', 'TUSCALOOSA', 'AL', ''); 

我不斷收到的錯誤是

org.postgresql.util.PSQLException: ERROR: column "coordinates" is of type geography but expression is of type character varying 
    Hint: You will need to rewrite or cast the expression. 
    Position: 203 

coordinates列的類型的GEOGRAPHY(POINT)

+2

留出周圍的單引號''點(33.206201 -87.525480)''。這是一個函數調用,而不是字符串文字 –

+0

@a_horse_with_no_name,這實際上並不適用於Postgres JDBC驅動程序。 'statement.setString(1,「POINT(1 2)」);'導致投訴ERROR:column「geography」是地理類型的類型,但表達式的類型是字符......' – lreeder

+2

您的SQL語句不會使使用參數,這就是爲什麼我寫這個。對於PreparedStatement,你需要在SQL字符串(*沒有*單引號)和*兩個*'setFloat()'調用中指向(?,?)'來爲每個'提供值?' –

回答

0

我知道這是一個老問題,但我只花大半天的調試相同的基本問題,並最終發現一個修補程序

你想要做的是使用WKT提供POINT並讓服務器自動將其轉換爲Geometry

而且正如您已經發現,如果您將WKT包含在SQL的主體內部,那麼該方法就有效,但如果您在準備好的語句中使用參數,則會失敗。

有3個選項用於固定它:

  1. 使用st_GeographyFromText在你的SQL就像這樣:

    INSERT INTO Hvbp(coordinates) VALUES(st_GeographyFromText(?)) 
    

    然後將參數設置爲WKT與setString
    根據涉及的框架,這可能不適合你。

  2. 使用setObject準備好的語句而不是setString。例如:

    ps.setObject(1, "POINT(33.206201 -87.525480)", java.sql.Types.OTHER) 
    
  3. 更改您的JDBC驅動程序設置發送字符串作爲unspecified類型,然後服務器會做類型轉換爲你。要做到這一點,你想你的JDBC URL更改爲類似

    "jdbc:postgresql:my_db?stringtype=unspecified" 
    
0

@Tim - 感謝您用一個類似的問題你的幫助 - 我不得不寫ST_GeometryFromText到我的數據庫和JDBC驅動程序扔了類似於@Hanks的例外。

更多參考和澄清他人 - 這是使用Java和JDBC我的結果:

INSERT INTO streets.points (point_id, the_geom) 
     VALUES(?, ST_GeomFromText(? , 25832) ); 

和插入的幾何字符串看上去像是:

POINT(33.206201 -87.525480)