【问题标题】:"IllegalArgumentException occurred while calling setter for property" from sqlserver numeric to java object从 sqlserver 数字到 java 对象的“调用属性设置器时发生 IllegalArgumentException”
【发布时间】:2023-03-04 01:45:01
【问题描述】:

当您尝试执行不适当的匹配(日期到布尔值等)时,我已经遇到了这样的错误,我可以很容易地修复它。

但这一次,我很困惑,因为hibernate拒绝将“数字”Id与Java“Long”匹配(当为Double,Integer,Float,String,int,long创建setter时,它也失败了,等等)

sql-server 字段“id”是一个NUMERIC(19,0)

我的 DTO 是:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class DtoResult {

private Long id;
private String name;
// ...


public Long getId() {
    return id;
}
public void setId(final Long id) {
    this.id = id;
}   
public String getName() {
    return name;
}
public void setName(final String name) {
    this.name = name;
}
}

我的休眠查询:

    final SQLQuery query= getCurrentSession().createSQLQuery(select + from + where);

    query.setParameter("manyFields", manyFields);
        query
        .addScalar("id")
        .addScalar("name")
        .setResultTransformer(Transformers.aliasToBean(DtoResult.class));

    return query.list(); // List<DtoResult>

错误:

IllegalArgumentException  occurred while calling setter for property [com.some.thing.DtoResult.id (expected type = java.lang.Long)]; target = [com.some.thing.DtoResult@77a70b79], property value = [269895]

我对此感到非常困惑,因此欢迎任何帮助。

感谢您一直阅读。

【问题讨论】:

    标签: java sql-server hibernate


    【解决方案1】:

    只需添加预期的类型,例如:

        .addScalar("id", new LongType())
        .addScalar("name", new StringType())
    

    【讨论】:

    • 成功了:太好了,非常感谢。虽然,我不确定是否理解;我做了很多次这样的查询,没有添加“类型”。为什么我现在必须指定它?请求的表之一实际上是一个视图。这可能是原因吗?
    【解决方案2】:

    数据库查询的数字不是 Long 而是 BigInteger。

    将设置器更改为:

    public void setId(final Number id) {
        this.id = id != null ? id.longValue() : null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      相关资源
      最近更新 更多