Erro salvar no banco de dados

Pelo erro é algum atributo de data/hora, só não consegui achar.

Hibernate: insert into TAB_REQUISICAO (TS_CADASTRO, TS_MOVIMENTACAO, ST_SITUACAO, IP_MOVIMENTACAO, CD_LOGIN_MOVIMENTACAO, ST_REGISTRO, TP_OPERACAO, NR_VERSAO, ST_CENTRAL, DS_CHAVE, FK_COTACAO, DT_ENTREGA, TS_ENVIO, ST_ENVIALINKS, FK_FUNCIONARIO, FK_LOJA_DESTINO, FK_LOJA_ORIGEM, DS_MSG, NR_NUMERO, OB_OBSERVACAO, ST_STATUS_REQUISICAO, ST_TIPOREQ, VR_TOTAL, FK_USUARIO) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) select scope_identity()
2023-10-15 15:07:59 - o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 242, SQLState: S0003
2023-10-15 15:07:59 - o.h.e.jdbc.spi.SqlExceptionHelper - A conversão de um tipo de dados varchar em um tipo de dados datetime resultou em um valor fora do intervalo.
2023-10-15 15:07:59 - b.c.g.p.resource.MensagensRetorno - could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement

Estou com este erro mas não consegui entender


image

Olhando de forma rápida, parece que a data de entrega é do tipo datetime no schema e parece que você está passando somente uma data!

Mude o tipo da coluna para date ou altere a lógica para passar uma data + hora.

1 curtida

Mas está tudo como LocalDateTime, tanto o DTO e o Model.
DTO

package br.com.ghnetsoft.comprasfood.requisicaocompras.dto.requisicaocentral;

import static lombok.AccessLevel.PROTECTED;

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

import br.com.ghnetsoft.comprasfood.requisicaocompras.regra.requisicaocentral.RequisicaoCentralRegra;
import br.com.ghnetsoft.comprasfood.requisicaocompras.regra.requisicaocentral.RequisicaoCentralValid;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@ToString(of = { "idFuncionario", "idLojaDestino", "idsLojaOrigem", "observacao", "dataEntrega", "idsGrupo", "idSetor", "idCategoria", "idGrupo", "idInsumo", "selecionados", "todosItens", "links", "requisicao", "contagem" })
@RequisicaoCentralValid(groups = { RequisicaoCentralRegra.class })
@Setter
@Getter
@Builder
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
public class RequisicaoCentralFormDTO implements Serializable {

    private static final long serialVersionUID = 8582451765463485134L;
    private Long idFuncionario;
    private Long idLojaDestino;
    private Collection<Long> idsLojaOrigem;
    private String observacao;
    private LocalDateTime dataEntrega;
    private Collection<Long> idsGrupo;
    private Long idSetor;
    private Long idCategoria;
    private Long idGrupo;
    private Long idInsumo;
    private boolean todosItens;
    private boolean links;
    private boolean requisicao;
    private boolean contagem;
    private Collection<RequisicaoItemCentralDTO> selecionados;
}

Model

package br.com.ghnetsoft.comprasfood.model;

import static javax.persistence.CascadeType.PERSIST;
import static javax.persistence.EnumType.STRING;
import static javax.persistence.FetchType.LAZY;
import static javax.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;
import static org.hibernate.annotations.CacheConcurrencyStrategy.NONSTRICT_READ_WRITE;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.Cache;

import br.com.ghnetsoft.comprasfood.model.enuns.StatusRequisicaoEnum;
import br.com.ghnetsoft.principal.auditoria.AuditableBase;
import br.com.ghnetsoft.principal.enuns.SimNaoEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@ToString(of = { "id", "usuario", "funcionario", "cotacao", "lojaOrigem", "numero", "dataEntrega", "status",
		"observacao", "total", "central" })
@EqualsAndHashCode(of = "id", callSuper = false)
@Setter
@Getter
@Entity
@Builder
@Table(name = "TAB_REQUISICAO")
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PROTECTED)
@Cache(usage = NONSTRICT_READ_WRITE)
public class Requisicao extends AuditableBase {

	private static final long serialVersionUID = -5265418488982586589L;
	@Id
	@Column(name = "PK_REQUISICAO")
	@GeneratedValue(strategy = IDENTITY)
	private Long id;
	@ManyToOne(targetEntity = Usuario.class)
	@JoinColumn(name = "FK_USUARIO")
	private Usuario usuario;
	@ManyToOne(targetEntity = Funcionario.class)
	@JoinColumn(name = "FK_FUNCIONARIO")
	private Funcionario funcionario;
	@ManyToOne(targetEntity = Cotacao.class)
	@JoinColumn(name = "FK_COTACAO")
	private Cotacao cotacao;
	@ManyToOne(targetEntity = Loja.class)
	@JoinColumn(name = "FK_LOJA_ORIGEM")
	private Loja lojaOrigem;
	@ManyToOne(targetEntity = Loja.class)
	@JoinColumn(name = "FK_LOJA_DESTINO")
	private Loja lojaDestino;
	@Column(name = "NR_NUMERO")
	private Long numero;
	@Column(name = "DT_ENTREGA")
	private LocalDateTime dataEntrega;
	@Enumerated(STRING)
	@Column(name = "ST_STATUS_REQUISICAO")
	private StatusRequisicaoEnum status;
	@Column(name = "OB_OBSERVACAO")
	private String observacao;
	@Column(name = "VR_TOTAL")
	private BigDecimal total;
	@Enumerated(STRING)
	@Column(name = "ST_CENTRAL")
	private SimNaoEnum central;
	@Column(name = "ST_ENVIALINKS")
	private Long enviaLinks;
	@Column(name = "DS_CHAVE")
	private String chave;
	@Column(name = "DS_MSG")
	private String mensagem;
	@Column(name = "TS_ENVIO")
	private LocalDateTime dataHoraEnvio;
	@Column(name = "ST_TIPOREQ")
	private Long tipoRequisicao;

	@OneToMany(mappedBy = "requisicao", targetEntity = RequisicaoItem.class, cascade = PERSIST, fetch = LAZY)
	@Cache(usage = NONSTRICT_READ_WRITE)
	@BatchSize(size = 20)
	private Collection<RequisicaoItem> requisicoesItens;
}

Qual banco de dados vc está usando?

1 curtida

Você precisa configurar um Converter para transformar o LocalDateTime em Timestamp e vice-versa.

1 curtida

SQL SERVER

Mas estranho que em outro DTO e outro model desta mesma maneira não dá erros.

Mas vou testar para este

Não funcionou

Mesmo estando com LocalDateTime o valor que está sendo carregado conforme seu próprio print não está bem formatado, acredito que isso esteja gerando o erro de imprecisão.

1 curtida

Aquilo ali é apenas o toString do LocalDateTime, por baixo dos panos ele não tem um formato, pois é apenas um valor numérico do tipo long.

1 curtida

Estranho que no servidor de homologação funciona.
Só em local que não.

Estava assim:
entidade.setDataEntrega(dto.getDataEntrega());, isto é um LocalDateTime recebendo um LocalDateTime

Mesmo colocando assim:
entidade.setDataEntrega(LocalDateTime.now());, acontece o mesmo erro
image

Local só funciona se este atributo ficar nulo