参数值 [%Gabrek%] 与预期类型不匹配 [java.lang.Character (n/a)];

Parameter value [%Gabrek%] did not match expected type [java.lang.Character (n/a)];

我一直在使用 JPA 在 Spring Boot Web 中编写一个程序,我正在使用一个查询来访问带有 'contains' 和 'ignorecase' 过滤器的一些数据,我以前在其他程序中做过这个并且工作正常,但现在我收到这个错误,我在这一点上完全迷路了,因为我在 google 中找不到任何东西,我走得很远寻找它发生的原因的兔子洞,到目前为止,我在我的代码中没有看到任何不合适的地方,声明的变量类型似乎没问题,但正如我所说,我迷路了。重要的是要提到,出于某种原因,当我第一次在我的网站上进行查询时,一切正常,我得到了正确的结果,但是当我回到家并尝试另一个查询(甚至是相同的)我得到了错误。代码如下:

型号

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Serie {
    
    @Id
    @Column(columnDefinition = "NUMERIC(19,0)")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    private String red;
    @Column(columnDefinition = "NUMERIC(19,0)")
    private double rating;

存储库

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import cl.desafiolatam.imdb.modelo.Serie;

public interface SerieRepository extends JpaRepository<Serie, Integer> {

    public List<Serie> findByTitleContainingIgnoreCase(String title);
    
}

服务

import cl.desafiolatam.imdb.vo.SerieVO;

public interface SerieService {
    
    public SerieVO findByTitleContainingIgnoreCase(String title);

}

服务实施

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cl.desafiolatam.imdb.dao.SerieRepository;
import cl.desafiolatam.imdb.modelo.Serie;
import cl.desafiolatam.imdb.service.SerieService;
import cl.desafiolatam.imdb.vo.SerieVO;

@Service
public class SerieServiceImpl implements SerieService {
    
    private static final Logger logger = LoggerFactory.getLogger(SerieServiceImpl.class);
    
    @Autowired
    SerieRepository dao;
    SerieVO respuesta;

    @Override
    @Transactional(readOnly = true)
    public SerieVO findByTitleContainingIgnoreCase(String title) {
        
        respuesta = new SerieVO("Ha ocurrido un error!", "104", new ArrayList<Serie>());

        try {
            List<Serie> serie = dao.findByTitleContainingIgnoreCase(title);
            System.out.println(serie);
            if(serie.size() > 0) {
                respuesta.setSeries(serie);
                respuesta.setMensaje("Se ha encontrado el registro");
                respuesta.setCodigo("0");
            } else {
                respuesta.setMensaje("No se ha encontrado el registro");
                respuesta.setCodigo("104");
            }
        } catch (Exception e) {
            logger.error("Error al buscar la serie", e);
        }
        
        return respuesta;
    }

}

视觉对象

import java.util.List;

import cl.desafiolatam.imdb.modelo.Serie;

public class SerieVO extends GenericVO {
    
    List<Serie> series;

    public SerieVO(String mensaje, String codigo, List<Serie> series) {
        super(mensaje, codigo);
        this.series = series;
    }

    public SerieVO() {
        super();
    }

控制器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import cl.desafiolatam.imdb.modelo.Serie;
import cl.desafiolatam.imdb.service.SerieService;
import cl.desafiolatam.imdb.vo.SerieVO;

@Controller
public class SerieController {

    private final static Logger logger = LoggerFactory.getLogger(SerieController.class);

    @Autowired
    private SerieService svc;

@GetMapping("/buscarSerie")
    public ModelAndView buscarSerie(Model model, @RequestParam String nombreSerie) {
        
        SerieVO respuestaServicio = new SerieVO();
        respuestaServicio.setMensaje("No se ha encontrado la serie");
        
        try {
            respuestaServicio = svc.findByTitleContainingIgnoreCase(nombreSerie);
            model.addAttribute("listaSeries", respuestaServicio.getSeries());
            return new ModelAndView("resultadoserie");
        } catch (Exception e) {
            logger.error("Error al buscar la serie", e);
        }
        
        return new ModelAndView("redirect:/user");
        
    }
}

搜索输入

<div class="d-flex justify-content-center pb-2">
        <div class="container row">
            <div class="col-md-4">
                <div class="d-flex justify-content-center">
                    <h2>Buscar serie</h2>
                </div>
            </div>
            <div class="col-md-8">
                <form action="buscarSerie" method="get">
                    <div class="row g-2">
                        <div class="col-md">
                            <div class="form-floating">
                                <input type="text" class="form-control" id="floatingInputGrid"
                                    value="" name="nombreSerie" required> <label
                                    for="floatingInputGrid">Serie</label>
                            </div>
                        </div>
                    </div>
                    <div class="d-flex justify-content-center pt-4">
                        <input type="submit" class="btn m-2 btn-dark" value="Buscar" />
                    </div>
                </form>
            </div>
        </div>
    </div>

正如我所说,我真的迷路了,到处研究,并检查了我上一个项目中的代码,我就是找不到为什么这个让我这么脏。甚至一开始就不会失败,它让我看到了希望,当我想重试时,它粉碎了那一点点希望。 :)

我尝试删除我的代码并从我知道它按预期工作的项目中复制和粘贴,更改变量和参数。名称以使其与新程序一起使用但没有用。并排比较,尝试使用 @Query 编写特定指令。寻找信息。仅使用 'contains' 过滤器,但没有任何效果。

根据 Spring Data JPA issue #2472 这似乎是 Hibernate 5.6.6 和 5.6.7 中的一个问题。

Hibernate 错误是 HHH-15142

解决方案是降级到 Hibernate 5.6.5 或等待 Hibernate 补丁来解决此问题。