2016-11-30 37 views
0

這些是我通過JPA插入到PostgreSQL時需要完成的事情。Spring MVC JPA原生插入返回生成的列

1)插入到一個表具有以下加入到所述插入件的端部「ON CONFLICT什麼都不做」(或一些註釋如果存在)

2)具有將生成的ID列中返回

目前我使用下面的方法,但它不返回生成列...

@Transactional 
    @Modifying 
    @Query(nativeQuery = true, value = "INSERT INTO table_name (value1) values(?1) ON CONFLICT DO NOTHING") 
    int insertWithoutConflict(Long value1); 

的解決方案,我有沒有涉及JPA的工作原理是以下....

try(Connection conn = DatabaseUtils.getConnection()) { 
    Statement statement = conn.createStatement(); 
    statement.execute(query, Statement.RETURN_GENERATED_KEYS); 
    ResultSet resultSet = statement.getGeneratedKeys(); 
    if (resultSet.next()) 
     return resultSet.getLong(1); 
} 

唯一的問題是,我然後是繞過我們當前的過程,然後不得不開始實施連接池,我不想進入。我想知道這個解決方案在JPA或Hibernate中是否可行。

根據@Kayaman

回答
@Transactional 
    @Query(nativeQuery = true, value = "INSERT INTO My_Table(value_1, value_2) values(?1, ?2) RETURNING any_column") 
    Long insertWithoutConflict(String value1, Long value2); 

也可以返回模型對象,我相信

@Transactional 
    @Query(nativeQuery = true, value = "INSERT INTO My_Table(value_1, value_2) values(?1, ?2) RETURNING column_1, columnName_2, columnName_3, columnName_4") 
    YourModelObject insertWithoutConflict(String value1, Long value2); 

回答

0

取出@Modifying註解,因爲它的查詢可能不會修改數據。

然後加入ON CONFLICT DO NOTHING RETURNING value1(或RETURNING *),但你必須要改變intInteger因爲衝突將不會返回任何生成的值。

+0

很好的回答,讓我得到了我需要的最終答案。你可以修改你的答案,並說明我需要刪除修改,然後我可以返回你說的整數值?修改使得我沒有得到結果。我刪除了它,並能夠獲得Long或Integer,甚至可以使用我正在使用的Model。我只需在返回的「RETURNING」參數中返回該模型中的所有值。 –

+0

一旦答案更新,我會接受它!並希望它會幫助別人:) –

+0

啊,是的,修改註釋將無法正常工作。 – Kayaman