我正在使用SpringBoot应用程序,我正在尝试使用以下方法进行简单删除:@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')
gbPccStr - 'P0','P1'
我正在实现上述代码,以便根据复合主键删除记录,复合主键是GUELTIG_AB
&amp;的组合。 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&amp;在这里吸气
答案 0 :(得分:1)
这些是绑定参数,它们与SQL语句分开传递给数据库。它们不用于创建带有连接到其中的参数的新SQL语句。
那么具有给定参数的Trunc(typ.GUELTIG_AB) IN (?1)
真正归结为:
从
GUELTIG_AB
丢弃时间部分,使用系统默认格式将其转换为String,无论发生什么情况,并检查结果字符串是否包含在由单个字符串组成的列表中:&#34; TO_DATE(&#39; 12月12日&#39;,&#39; dd-MM-yy&#39;),TO_DATE(&#39; 2012年9月14日&#39;,& #39; DD-MM-YY&#39;)&#34;
你可能想要的更接近:
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
&amp;的组合。GB_PCC
。如果可能,建议我如何使用QueryMethod查询来实现这一目的?
这根本不是当前查询正在做的事情。 如果您有包含以下键的行:
(d1,p1)
(d1,p2)
(d2,p1)
(d2,p2)
您无法使用此方法删除例如(d1,p1)
和(d2,p2)
,因为它还会删除其他两个元素。
为了解决这个问题,请在您的实体上声明@IdClass
。在存储库的类型参数中指定它,并使用常规查询方法。
答案 1 :(得分:0)
首先,在@Param中的datumStr之后有一个空格(&#34; datumStr&#34;)。接下来,将其类型更改为String of List,并以默认DB日期格式传递日期字符串。
(您应该将gbPccStr的类型更改为Sting List)
答案 2 :(得分:0)
你可以这样做。
@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中的第一个日期给出第二个日期