使用@Query&插入spring-data-jpa @Modifying不使用nativeQuery或save()或saveAndFlush()

时间:2017-08-18 02:57:38

标签: hibernate insert spring-data spring-data-jpa

我看过这些链接

我的例子如下:

Person是一个简单的实体w / 3字段“Long id,String name,Integer age”,并映射到相应的Person表,每个上面有3列)

@Repository
public interface DualRepository extends JpaRepository<Dual,Long> {
    @Modifying
    @Query(? - what goes here - ?)
    public int modifyingQueryInsertPerson(@Param("id")Long id, @Param("name")String name, @Param("age")Integer age);
}

是否有办法只使用@Query&amp; amp; @Modifying(即不使用本机SQL查询&amp; nativeQuery = true,或者save(),或saveAndFlush()?

3 个答案:

答案 0 :(得分:3)

您可以像下面那样传递Java对象,而不是传递所有参数

 @Modifying(clearAutomatically = true)
    @Transactional
    @Query(value = "insert into [xx_schema].[shipment_p] (gpn,qty,hscode,country_of_origin,created_date_time,shipment_id) "
            + "VALUES (:#{#sp.gpn},:#{#sp.qty},  :#{#sp.hscode} ,:#{#sp.countryOfOrigin}, :#{#sp.createdDateTime}, :#{#sp.id} )", nativeQuery = true)
    public void saveShipmentPRoducts(@Param("sp") ShipmentProducts sp);

答案 1 :(得分:0)

尝试了几件事后,有一种方法可以做到这一点,但这取决于您使用的数据库。

以下是Oracle和我的工作。在表中插入了1行(使用Dual表,因为我可以使用&#34;来自Dual&#34;在&#34;选择&#34之后):

@Repository
public interface DualRepository extends JpaRepository<Dual,Long> {
    @Modifying
    @Query("insert into Person (id,name,age) select :id,:name,:age from Dual")
    public int modifyingQueryInsertPerson(@Param("id")Long id, @Param("name")String name, @Param("age")Integer age);
}

在MS SqlServer中,可以选择&#34;选择&#34;如果没有&#34;来自&#34;,那么&#34;选择10,&#39; name10&#39;,100&#34;工作,所以下面应该适用于MS Sqlserver(但没有测试过)

@Repository
public interface PersonRepository extends JpaRepository<Person,Long> {
    @Modifying
    @Query("insert into Person (id,name,age) select :id,:name,:age")
    public int modifyingQueryInsertPerson(@Param("id")Long id, @Param("name")String name, @Param("age")Integer age);
}

我没试过w /任何其他数据库。这是一个链接,显示(最后)哪个db支持选择没有from子句的stmts:http://modern-sql.com/use-case/select-without-from

答案 2 :(得分:0)

@Query通常用于创建自定义用户查询以从数据库中获取值

@Query @Modifying用于执行数据库

中的更新操作

save方法用于插入新记录或更新会话中的记录。