SQL Error: 1292, SQLState: 22001 Как исправить ошибку? Хелп!

Ошибка:

2021-11-08 17:09:03.305  WARN 34020 --- [legram Executor] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1292, SQLState: 22001
2021-11-08 17:09:03.305 ERROR 34020 --- [legram Executor] o.h.engine.jdbc.spi.SqlExceptionHelper   : Data truncation: Incorrect date value: '' for column 'end_date' at row 1
2021-11-08 17:09:03.320 ERROR 34020 --- [legram Executor] o.t.t.u.DefaultBotSession                : org.hibernate.exception.DataException: could not execute statement

Баз даных:

-- auto-generated definition
create table tender
(
    id           int auto_increment
        primary key,
    found_date   date         not null,
    update_date  date         not null,
    subject      varchar(150) not null,
    organization varchar(150) not null,
    price        varchar(20)  not null,
    info         varchar(500) not null,
    status       varchar(20)  not null,
    start_date   date         not null,
    end_date     date         not null,
    url          varchar(100) not null,
    search_id    int          not null,
    constraint tender_fk0
        foreign key (search_id) references search (id)
);

Search.java

package org.kasad0r.bot.look4tender;

import jdk.nashorn.api.scripting.ScriptObjectMirror;
import org.kasad0r.bot.MySQL.HibernateUtil;
import org.kasad0r.bot.MySQL.SearchEntity;
import org.kasad0r.bot.MySQL.TenderEntity;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;

public class Search {

    public static boolean execute(SearchEntity search) {
//инициализация обработчика скриптов nashorn
        boolean changed = false;
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        try {
//передача скрипта
            engine.eval(search.getPlatformByPlatformId().getScript());
            Invocable invocable = (Invocable) engine;

//вызов метода init с параметром keyword из js
            invocable.invokeFunction("init", search.getKeyword());

//получение результатов поиска (тендеров) при вызове функции searchTenders
            ArrayList<ScriptObjectMirror> tenders = (ArrayList<ScriptObjectMirror>) invocable.invokeFunction("searchTenders");

            for (ScriptObjectMirror s : tenders) {
                ArrayList<TenderEntity> tenderList = HibernateUtil.selectTender("from TenderEntity where id = '" +
                            s.getMember("id") + "' and searchBySearchId.id = " + search.getId());


                if (tenderList.size()==0) {
                    TenderEntity newTender = new TenderEntity();
                    newTender.setSubject(s.get("subject").toString());
                    newTender.setOrganization(s.get("organization").toString());
                    newTender.setPrice(s.get("price").toString());
                    newTender.setStatus(s.get("status").toString());
                    newTender.setStartDate(s.get("start_date").toString());
                    newTender.setEndDate(s.get("end_date").toString());
                    newTender.setUrl(s.get("url").toString());
                    newTender.setFoundDate(Date.valueOf(LocalDate.now()));
                    newTender.setUpdateDate(Date.valueOf(LocalDate.now()));
                    newTender.setSearchBySearchId(search);
                    HibernateUtil.insert(newTender);
                    changed = true;
                }
                else {
                    TenderEntity tender = tenderList.get(0);
                    if (!tender.getPrice().equals(s.get("price").toString())) {
                        tender.setPrice(s.get("price").toString());
                        changed = true;
                    }
                    if (!tender.getSubject().equals(s.get("subject").toString())) {
                        tender.setSubject(s.get("subject").toString());
                        changed = true;
                    }
                    if (!tender.getOrganization().equals(s.get("organization").toString())) {
                        tender.setOrganization(s.get("organization").toString());
                        changed = true;
                    }
                    if (!tender.getStatus().equals(s.get("status").toString())) {
                        tender.setStatus(s.get("status").toString());
                        changed = true;
                    }if (!tender.getUrl().equals(s.get("url").toString())){
                        tender.setUrl(s.get("url").toString());
                        changed = true;
                    }if
                    (!tender.getStartDate().equals(s.get("start_date").toString())){
                        tender.setStartDate(s.get("start_date").toString());
                        changed = true;
                    }if
                    (!tender.getEndDate().equals(s.get("end_date").toString())) {
                        tender.setEndDate(s.get("end_date").toString());
                        changed = true;
                    }if (changed){
                        tender.setUpdateDate(Date.valueOf(LocalDate.now()));
                        HibernateUtil.update(tender);
                    }
                }
            }

        } catch (ScriptException e) { e.printStackTrace();
        } catch (NoSuchMethodException e) { e.printStackTrace();
        }
        return changed;
    }
}

TenderEntiny.java

package org.kasad0r.bot.MySQL;

import javax.persistence.*;
import java.sql.Date;

@Entity
@Table(name = "tender", schema = "bot", catalog = "")
public class TenderEntity extends DataEntity {
    private int  id;
    private Date foundDate;
    private Date updateDate;
    private String subject;
    private String organization;
    private String price;
    private String status;
    private String startDate;
    private String endDate;
    private String url;
    private String tenderId;
    private SearchEntity searchBySearchId;

    @Id
    @Column(name = "id", nullable = false) public int getId() {
        return id;
    }

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

    @Basic
    @Column(name = "found_date", nullable = false) public Date getFoundDate() {
        return foundDate;
    }

    public void setFoundDate(Date foundDate) {
        this.foundDate = foundDate;
    }

    @Basic
    @Column(name = "update_date", nullable = true) public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    @Basic
    @Column(name = "subject", nullable = false, length = 500)
    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    @Basic
    @Column(name = "organization", nullable = false, length = 150)
    public String getOrganization() {
        return organization;
    }

    public void setOrganization(String organization) {
        this.organization = organization;
    }

    @Basic
    @Column(name = "price", nullable = true, length = 50)
    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    @Basic
    @Column(name = "status", nullable = true, length = 20)
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Basic
    @Column(name = "start_date", nullable = true)
    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    @Basic
    @Column(name = "end_date", nullable = true)
    public String getEndDate() {
        return endDate;
    }

    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }

    @Basic
    @Column(name = "url", nullable = false, length = 100)
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }


    public void setTenderId(String tenderId) {
        this.tenderId = tenderId;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        TenderEntity that = (TenderEntity) o;

        if (id != that.id) return false;
        if (foundDate != null ? !foundDate.equals(that.foundDate) : that.foundDate != null) return false;
        if (updateDate != null ? !updateDate.equals(that.updateDate) : that.updateDate != null) return false;
        if (subject != null ? !subject.equals(that.subject) : that.subject != null) return false;
        if (organization != null ? !organization.equals(that.organization) : that.organization != null) return false;
        if (price != null ? !price.equals(that.price) : that.price != null) return false;
        if (status != null ? !status.equals(that.status) : that.status != null) return false;
        if (startDate != null ? !startDate.equals(that.startDate) : that.startDate != null) return false;
        if (endDate != null ? !endDate.equals(that.endDate) : that.endDate != null) return false;
        if (url != null ? !url.equals(that.url) : that.url != null) return false;
        if (tenderId != null ? !tenderId.equals(that.tenderId) : that.tenderId != null) return false;


        return true;

    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (foundDate != null ? foundDate.hashCode() :   0);
        result = 31 * result + (updateDate != null ? updateDate.hashCode() :0);
        result = 31 * result + (subject != null ? subject.hashCode() : 0);
        result = 31 * result + (organization != null ? organization.hashCode() : 0);
        result = 31 * result + (price != null ? price.hashCode() : 0);
        result = 31 * result + (status != null ? status.hashCode() : 0);
        result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
        result = 31 * result + (endDate != null ? endDate.hashCode() : 0);
        result = 31 * result + (url != null ? url.hashCode() : 0);
        result = 31 * result + (tenderId != null ? tenderId.hashCode() : 0);
        return result;
    }


    @ManyToOne
    @JoinColumn(name = "search_id", referencedColumnName = "id", nullable = false)
    public SearchEntity getSearchBySearchId() {
        return searchBySearchId;
    }

    public void setSearchBySearchId(SearchEntity searchBySearchId) {
        this.searchBySearchId = searchBySearchId;

    }
}

zakazrf.ru.js

var keyword;
var url2 = 'http://www.zakazrf.ru/NotificationEx/Index?Filter=1&FastFilter=' + keyword

var forEach = Array.prototype.forEach;


var Connector = Java.type('org.kasad0r.bot.look4tender.Connector');
var Selector = Java.type('org.kasad0r.bot.look4tender.Selector');

var init = function(keyword2) { 
    
    keyword = keyword2;
    
        var doc = Connector.getDoc(url2);
    
        lastPage = Selector.select(doc, 'input:nth-child(2)').attr("value");
    
        print(lastPage);
    };

var searchTenders = function() {

    var list = new java.util.ArrayList();

        doc = Connector.getDoc(url2);

        var tenders = Selector.select(doc, 'tbody > tr');
        tenders.remove(tenders.first());


        forEach.call(tenders, function(v) { print(1);
                var subject = v.select('td:nth-child(5)').text();
                var status = v.select('td:nth-child(3)').text();
                var price = v.select('td:nth-child(6)').text();
                var organization = v.select('td:nth-child(7)').text();
                var tender_id = v.select('td:nth-child(2)').text();
                var end_date = v.select('td:nth-child(15)').text().substring(0,11);
                var start_date = v.select('td:nth-child(10)').text().substring(0,11);
                var url = 'zakazrf.ru' + v.select('td:nth-child(2) > a').attr('href');


                list.add(new Tender(tender_id, subject, status, price, organization, url, start_date, end_date));
            }
        );
        
    return list;
}



function Tender(id, subject, status, price, organization, url, start_date, end_date) {

    this.id = id;
    this.subject = subject;
    this.status = status;
    this.price = price;
    this.organization = organization;
    this.url = url;
    this.start_date = start_date;
    this.end_date = end_date;
}

Искал каждый end_date там все нормально, откуда ''?

Не могу найти ошибку, помогите!


Ответы (1 шт):

Автор решения: Alex Rudenko

Здесь основная проблема с дизайном состоит в том, что в базе для полей start_date, end_date используется тип date с ограничением NOT NULL, а в классе-сущности указан тип String и стоит nullable = true. Если база генерируется из сущностей, её явно надо перегенерировать.

→ Ссылка