Spring boot 在Spring JPA本机查询中使用Spel表达式时出错(将字符串转换为Hexa)

Spring boot 在Spring JPA本机查询中使用Spel表达式时出错(将字符串转换为Hexa),spring-boot,spring-data,spring-data-jpa,Spring Boot,Spring Data,Spring Data Jpa,我使用以下方法创建了一个存储库 @Modifying(clearAutomatically = true) @Query( value = "UPDATE address SET address_line_1 = :#{#address.getAddressLine1()} , address_line_2 = :#{#address.getAddressLine2()} ," + " address_line_3 = :#{#a

我使用以下方法创建了一个存储库

@Modifying(clearAutomatically = true)
@Query(
            value = "UPDATE address  SET address_line_1 = :#{#address.getAddressLine1()} , address_line_2 = :#{#address.getAddressLine2()} ," +
                    " address_line_3 = :#{#address.getAddressLine3()} , city = :#{#address.getCity()}  , address_type = :#{#address.getAddressType().toString()} ," +
                    " postal_code = :#{#address.getPostalCode()} , state = :#{#address.getState().toString()} , country= :#{#address.getCountry().toString()} , residence_type = :#{#address.getResidenceType().toString()}  ," +
                    " discriminator = :#{#address.getAddressType().toString()},created_by = :#{#address.getCreatedBy()} , created_date = :#{#address.getCreatedDateTime()}  WHERE address_id = :#{#address.getId()}",
            nativeQuery = true)
 void updateAddress(@Param("address") Address address);
在更新过程中,addressLine2/addressLine3将转换为hexa格式并存储在数据库中

例如,如果addressLine2作为1霍比特人办公室传递到方法中,它将转换为\X314F6666696365206F6620486F62697473,并存储为\X314F6666696365206F6620486F62697473

这只发生在少数更新上(不是全部更新)。在按预期更新的值和转换为hexa格式的值之间,我无法分辨出一种可区分的模式

救命

其他信息:

我甚至尝试不使用Spel表达式,我看到了相同的错误:

以下是一些更详细的信息:

存储库接口:

import com.company.domain.Address;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface AddressRepository extends JpaRepository<Address, Long> {

    @Modifying(clearAutomatically = true)
    @Query(
            value = "UPDATE address  SET address_line_1 = :address_line_1 , address_line_2 = :address_line_2 ," +
                    " address_line_3 = :address_line_3 WHERE address_id = :address_id ",
            nativeQuery = true)
    void updateAddress(@Param("address_line_1") String address_line_1,@Param("address_line_2") String address_line_2,@Param("address_line_3") String address_line_3,@Param("address_id") Long address_id);
}
当我调用服务方法时

addressService.updateAddress(地址)

我看到以下系统输出:

 {"addressId":2000112115,"addressLine1":"2001 Hussle
 Road2","addressLine2":"Office of Hobbits","addressLine3":null }

 2000112115 
 Office of Hobbits
但在数据库中,我看到:地址行2

\X4F6666696365206F6620486F62697473

更新2-添加地址类:

package com.company.domain;

import com.company.common.Identifiable;
import com.company.enums.AddressType;
import com.company.ResidenceType;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.EqualsExclude;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.HashCodeExclude;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.io.Serializable;
import java.time.LocalDateTime;


public class Address implements Identifiable<Long>, Serializable {

  private static final long serialVersionUID = 599052439022921076L;

  protected static final String INVALID_ADDRESS = "InvalidAddress";

  private Long addressId;
  private String addressLine1;
  private String addressLine2;
  private String addressLine3;

  @Override
  public Long getId() {
    return addressId;
  }

    public void setId(Long id) {
    this.addressId = id;
  }

  public Customer getCustomer() {
    return customer;
  }


  public String getAddressLine1() {
    return addressLine1;
  }

  public void setAddressLine1(String addressLine1) {
    this.addressLine1 = addressLine1;
  }

  public String getAddressLine2() {
    return addressLine2;
  }

  public void setAddressLine2(String addressLine2) {
    this.addressLine2 = addressLine2;
  }

  public String getAddressLine3() {
    return addressLine3;
  }

  public void setAddressLine3(String addressLine3) {
    this.addressLine3 = addressLine3;
  }



  @Override
  public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj, false);
  }


  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this, false);
  }


  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
  }


}
package com.company.domain;
导入com.company.common.identification;
导入com.company.enums.AddressType;
导入com.company.residentype;
导入org.apache.commons.lang3.builder.EqualsBuilder;
导入org.apache.commons.lang3.builder.EqualsExclude;
导入org.apache.commons.lang3.builder.HashCodeBuilder;
导入org.apache.commons.lang3.builder.HashCodeExclude;
导入org.apache.commons.lang3.builder.ToStringBuilder;
导入org.apache.commons.lang3.builder.ToStringStyle;
导入java.io.Serializable;
导入java.time.LocalDateTime;
公共类地址实现可识别的、可序列化的{
私有静态最终长serialVersionUID=599052439022921076L;
受保护的静态最终字符串无效\u ADDRESS=“InvalidAddress”;
私有长地址ID;
私有字符串地址行1;
私有字符串地址行2;
私有字符串地址行3;
@凌驾
公共长getId(){
返回地址ID;
}
公共无效集合id(长id){
this.addressId=id;
}
公共客户getCustomer(){
退货客户;
}
公共字符串getAddressLine1(){
返回地址行1;
}
公共无效setAddressLine1(字符串addressLine1){
this.addressLine1=addressLine1;
}
公共字符串getAddressLine2(){
返回地址行2;
}
公共无效setAddressLine2(字符串addressLine2){
this.addressLine2=addressLine2;
}
公共字符串getAddressLine3(){
返回地址行3;
}
公共无效setAddressLine3(字符串addressLine3){
this.addressLine3=addressLine3;
}
@凌驾
公共布尔等于(对象obj){
返回EqualsBuilder.reflectionEquals(this,obj,false);
}
@凌驾
公共int hashCode(){
返回HashCodeBuilder.reflectionHashCode(此为false);
}
@凌驾
公共字符串toString(){
返回ToStringBuilder.reflectionString(这是ToStringStyle.JSON_样式);
}
}

我强烈怀疑这与Spel表达式有关。你能提供一个简单但完整的例子来说明这种奇怪的行为吗?@Jenschauder我已经添加了更多的细节,如果你想了解更多的细节,请告诉我,基本上证明它与Spel无关。那么这个Address类是什么样子的呢?@jenschauder我添加了一个简单的Address,在实际中Address是一个抽象类,有两个具体的实现:国际和国内。两者都有获取显示地址的特定实现“获取显示地址的特定实现”是什么意思?
package com.company.domain;

import com.company.common.Identifiable;
import com.company.enums.AddressType;
import com.company.ResidenceType;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.EqualsExclude;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.HashCodeExclude;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.io.Serializable;
import java.time.LocalDateTime;


public class Address implements Identifiable<Long>, Serializable {

  private static final long serialVersionUID = 599052439022921076L;

  protected static final String INVALID_ADDRESS = "InvalidAddress";

  private Long addressId;
  private String addressLine1;
  private String addressLine2;
  private String addressLine3;

  @Override
  public Long getId() {
    return addressId;
  }

    public void setId(Long id) {
    this.addressId = id;
  }

  public Customer getCustomer() {
    return customer;
  }


  public String getAddressLine1() {
    return addressLine1;
  }

  public void setAddressLine1(String addressLine1) {
    this.addressLine1 = addressLine1;
  }

  public String getAddressLine2() {
    return addressLine2;
  }

  public void setAddressLine2(String addressLine2) {
    this.addressLine2 = addressLine2;
  }

  public String getAddressLine3() {
    return addressLine3;
  }

  public void setAddressLine3(String addressLine3) {
    this.addressLine3 = addressLine3;
  }



  @Override
  public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj, false);
  }


  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this, false);
  }


  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
  }


}