![](/img/trans.png)
[英]Spring Data JPA Native Query - Named parameters are not being registered
[英]Parameters not being set in native query
我正在開發一個 SpringBoot 應用程序,我正在嘗試使用以下@Query(value="", nativeQuery = true)
進行簡單的刪除: @Query(value="", nativeQuery = true)
我的查詢有動態參數,但參數沒有被替換,我也沒有在控制台上收到任何錯誤。
我嘗試了帶有硬編碼參數的 NativeQuery,它工作得非常好。
下面是代碼:
@Repository
public interface TypGbPccRepo extends JpaRepository<TypGbPcc, String>{
@Transactional
@Modifying(ClearAutomatically = true)
@Query(value = "delete from T_ST_KFR__TYP_GB_PCC typ where Trunc(typ.GUELTIG_AB) IN (?1) and typ.GB_PCC IN (?2)" , nativeQuery=true)
void deleteRecords(String datumStr , String gbPccStr);
}
我什至嘗試了以下查詢:
@Query(value = "delete from T_ST_KFR__TYP_GB_PCC typ where Trunc(typ.GUELTIG_AB) IN (:datumStr ) and typ.GB_PCC IN (:gbPccStr)" , nativeQuery=true)
void deleteRecords(@Param("datumStr ") String datumStr , @Param("gbPccStr") String gbPccStr);
我試圖替換的參數:
datumStr - TO_DATE('12-Sep-2012', 'dd-MM-yy'), TO_DATE('14-Sep-2012', 'dd-MM-yy')
-Sep TO_DATE('12-Sep-2012', 'dd-MM-yy'), TO_DATE('14-Sep-2012', 'dd-MM-yy')
gbPccStr - 'P0','P1'
我正在實施上面的代碼來刪除基於復合主鍵的記錄,復合主鍵是GUELTIG_AB
和GB_PCC
的組合。 如果可能,建議我如何使用查詢 QueryMethod 來實現這一點?
我已經能夠使用 QueryMethod 刪除基於未復合的 Primary 的記錄,但我無法對復合主鍵執行此操作。 我必須一次性刪除多條記錄。
下面是我的 POJO
@Entity
@IdClass(TypGbPccId.class)
@Table(name="T_ST_KFR_TYP_GB_PCC")
public class TypGbPcc implements Serializable{
private static final long serialVersionUID = .....
@Id
@Column(name="GB_PCC")
private String gbPcc = null ;
@Column(name="GB_PCC_desc")
priavte String gbPccDesc = null ;
@Column(name="GB_PCC_SQL")
priavte String gbPccSql = null ;
@Id
@Column(name="GUELTIG_AB")
@JsonFormat(pattern = "dd-MM-yyyy")
private String gueltigAb = null ;
}
setter 和 getter 在這里
這些是綁定參數,它們與 SQL 語句分開傳遞到數據庫。 它們不用於創建帶有連接到其中的參數的新 SQL 語句。
那么帶有給定參數的Trunc(typ.GUELTIG_AB) IN (?1)
真正歸結為:
丟棄
GUELTIG_AB
的時間部分,使用系統默認格式將其轉換為字符串,無論發生什么情況,並檢查結果字符串是否包含在由單個字符串組成的列表中: “TO_DATE('12-Sep-2012 ', 'dd-MM-yy'),TO_DATE('14-Sep-2012', 'dd-MM-yy')"
你可能想要的是更接近:
日期列表中的
GUELTIG_AB
元素有兩個元素2014 年 9 月 12 日和2014 年9 月14 日
因此,您的方法應如下所示:
@Modifying(ClearAutomatically = true)
@Query(value = "delete from T_ST_KFR__TYP_GB_PCC typ " +
"where Trunc(typ.GUELTIG_AB) IN (?1) " +
"and typ.GB_PCC IN (?2)"
, nativeQuery=true)
void deleteRecords(List<java.sql.Date> dates , List<String> gbPccStr);
注意:方法上不需要@Transactional
注解,接口上也不需要@Repository
注解。
我正在實施上面的代碼來刪除基於復合主鍵的記錄,復合主鍵是
GUELTIG_AB
和GB_PCC
的組合。 如果可能,建議我如何使用查詢 QueryMethod 來實現這一點?
這根本不是當前查詢在做什么。 如果您有具有以下鍵的行:
(d1,p1)
(d1,p2)
(d2,p1)
(d2,p2)
例如(d1,p1)
您不能使用這種方法刪除(d1,p1)
和(d2,p2)
,因為它還會刪除其他兩個元素。
為了解決這個問題, @IdClass
在您的實體上聲明一個@IdClass
。 在存儲庫的類型參數中指定它並使用普通查詢方法。
首先,@Param("datumStr ") 中的 datumStr 后面有一個空格。 接下來,將其類型更改為 List of String 並以默認數據庫日期格式傳遞日期字符串。
(您也應該將 gbPccStr 的類型更改為 Sting 列表)
你可以做這樣的事情。
@Query(value = "delete from TypGbPcc where func('TRUNC',gueltigAb) IN func('TO_DATE',:dateOne,'dd/mm/yyyy') and
func('TRUNC',gueltigAb) IN func('TO_DATE',:dateTwo,'dd/mm/yyyy') and gbPcc IN (:gbPccStr)" , nativeQuery=true)
void deleteRecords(@Param("dateOne") String dateOne ,@Param("dateTwo") String dateTwo, @Param("gbPccStr") String gbPccStr);
在 dateOne 中給出第一個日期 在 dateTwo 中給出第二個日期
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.