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. Если база генерируется из сущностей, её явно надо перегенерировать.