首页 > 解决方案 > Spring Data JPA 的奇怪行为

问题描述

这实际上不是一个问题,但可能是一个错误。

我有一个对象数组,我执行一个循环以将其保存到数据库中:

for (ThresholdParams p : threshold.getThresholdParams()) {
    if (!p.getInitialValue().isNaN() && !p.getStepValue().isNaN()) {
            thresholdParamsRepository.save(p);
        }
    }

thresholdParamsRepository是扩展CrudRepository的接口。

当数组没有任何无效的 NaN 值时,它可以正常工作。如果我执行调试,它每次都在保存语句中停止。

但是如果数组的第 8 个(例如)元素有一个 NaN 值,它会执行所有的 for 循环而不执行 if 并且因为 mysql 异常而崩溃:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“NaN”

我在保存语句中使用了一个断点来调试它,但在第一次保存后它跳过了它。我调试了所有,它执行了所有保存,直到它崩溃时的第 8 天。它没有将更改提交到数据库中。

我已经解决了它删除了具有 nan 值的元素,但我不知道它是否是与 java 或 spring data jpa 相关的错误。

这是 ThresholdParams 类:

@Entity
@Table(name="threshold_params")
public class ThresholdParams {

    @EmbeddedId
    private ThresholdParamsId thresholdParamsId;

    @Column(name="step_value")
    private Float stepValue;

    @Column(name="initial_value", nullable= true)
    private Float initialValue;

    @ManyToOne
    @JoinColumn(name="contextSourceId",insertable=false, updatable= false)
    private ContextSource contextSource;

    @Column(name="is_enabled", columnDefinition="bit default 1")
    private boolean isEnabled;

    public boolean getIsEnabled() {
        return isEnabled;
    }

    public void setIsEnabled(boolean isEnabled) {
        this.isEnabled = isEnabled;
    }

    @ManyToOne
    @JoinColumn(name="thresholdId",insertable=false, updatable= false)
    private Threshold threshold;

}

标签: javaspring-data-jpa

解决方案


由于没有列名'NaN'这就是你得到这个异常的原因:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'NaN' in 'field list'

你可以在你的代码中这样检查:

for (ThresholdParams p : threshold.getThresholdParams()) {
    if (p !=null) {
            thresholdParamsRepository.save(p);
        }
    }

这将检查您的域的空值,如果为真,将被保存。

我希望这将有所帮助。


推荐阅读