2016-11-30 78 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