2017-08-18 40 views
0

我看到這些鏈接彈簧數據JPA插入使用@Query&@Modifying而不使用nativeQuery或保存()或saveAndFlush()

我下面的例子是:

人是一個簡單的實體W/3場「龍ID,字符串名稱,整數年齡」,並映射到相應的Person表W持續高於/ 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 & @Modifying做插件(即不使用原生SQL查詢& nativeQuery = true,或者save()或saveAndFlush()?

回答

0

嘗試了幾件事後,有一種方法可以做到這一點,但它取決於你使用的數據庫。

@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有可能:

低於甲骨文(後「選擇」使用雙表,因爲我可以「從雙」使用),工作對我來說& 1行被插入到表有一個「選擇」無「從條款」,所以「選擇10,‘name10’,100」的作品,所以下面應該爲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 /任何其他數據庫。下面是示出一個鏈接(在端部),其分貝的支持選擇支桿沒有從子句:http://modern-sql.com/use-case/select-without-from

+0

經過進一步測試,它*不能在MS-SqlServer中工作,因爲MS-SqlServer不提供系統虛擬表(如Oracle中的DUAL)。 它*在Oracle和MySQL中工作,因爲它們都有一個DUAL虛擬表。 因爲HQL在SELECT之後需要FROM,所以只有底層數據庫有一個虛擬表(如Oracle中的DUAL)時,上述方法才能用於INSERT。 –

0

@Query一般用於創建自定義用戶查詢來從數據庫

@Query@Modifying用於執行值數據庫中的更新操作

save用於插入新記錄或更新會話中存在的記錄的方法。

+0

請參閱我上面的評論。 INSERT使用@ Query + @修改可以在具有虛擬表的數據庫上工作(如Oracle中的DUAL),這樣我們就可以在SELECT之後有一個FROM子句(這是HQL要求的)。 –

相關問題