【问题标题】:org.hibernate.TypeMismatchException: Provided id of the wrong type while fetching dataorg.hibernate.TypeMismatchException:在获取数据时提供了错误类型的 id
【发布时间】:2016-04-02 20:41:59
【问题描述】:

我正在尝试通过使用关键字查询(以“课程代码”的形式绑定)从数据库表“问题”中获取一些搜索结果。目标是从具有外键“Course_coursecode”的列中获取表中的结果,该外键是字符串值。这是我的代码 sn-p:

    @Transactional
            @RequestMapping(value = "/question-list", method = RequestMethod.GET)
            public ModelAndView viewQuestionList(@RequestParam("course-code")String code, ModelAndView model){

                    model.setViewName("question-list");

                    Question question = em.find(com.databaseproject.questor.model.Question.class, code);
                    model.addObject("question", question);

                    List<Question> questions = 

(List<Question>)em.createQuery("SELECT q FROM Question q WHERE q.Course_coursecode =: code")
                        .setParameter("code", code).getResultList();

                model.addObject("questionList", questions);

                return model;
        }

现在,当我使用格式为“CSE137”的字符串进行搜索时,我得到:

org.hibernate.TypeMismatchException:为类 com.databaseproject.questor.model.Question 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.String

java.lang.IllegalArgumentException:为类 com.databaseproject.questor.model.Question 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.String

org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.IllegalArgumentException:为类 com.databaseproject.questor.model.Question 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.String

有趣的是,当我输入一个 int 值作为搜索查询时,我得到了这个:

org.hibernate.TypeMismatchException:为类 com.databaseproject.questor.model.Question 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.String

java.lang.IllegalArgumentException:为类 com.databaseproject.questor.model.Question 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.String

org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.IllegalArgumentException:为类 com.databaseproject.questor.model.Question 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.String

我在这里做错了什么?我该如何解决?

更新: 这是我的实体类-

package com.databaseproject.questor.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class Question {

    @Id
    private int idQuestion;
    private String questionText;
    private String solutionText;
    private byte[] image;
    private String filepath;
    private int year;
    private String User_username;
    private int Teacher_idTeacher;
    private String Course_coursecode;

    @Transient
    private String encodedImage;

    public int getIdQuestion() {
        return idQuestion;
    }

    public void setIdQuestion(int idQuestion) {
        this.idQuestion = idQuestion;
    }

    public String getQuestionText() {
        return questionText;
    }

    public void setQuestionText(String questionText) {
        this.questionText = questionText;
    }

    public String getSolutionText() {
        return solutionText;
    }

    public void setSolutionText(String solutionText) {
        this.solutionText = solutionText;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

    public String getFilepath() {
        return filepath;
    }

    public void setFilepath(String filepath) {
        this.filepath = filepath;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getUser_username() {
        return User_username;
    }

    public void setUser_username(String user_username) {
        User_username = user_username;
    }

    public int getTeacher_idTeacher() {
        return Teacher_idTeacher;
    }

    public void setTeacher_idTeacher(int teacher_idTeacher) {
        Teacher_idTeacher = teacher_idTeacher;
    }

    public String getCourse_coursecode() {
        return Course_coursecode;
    }

    public void setCourse_coursecode(String course_coursecode) {
        Course_coursecode = course_coursecode;
    }

    public String getEncodedImage() {
        return encodedImage;
    }

    public void setEncodedImage(String encodedImage) {
        this.encodedImage = encodedImage;
    }
}

【问题讨论】:

  • 错误信息中有什么不清楚的地方?您正在尝试通过 ID 查找问题。问题的 ID 是整数类型。但是您将code 作为参数传递给em.find(),并且代码是字符串类型。因此例外。
  • @JBNizet 有道理,但请发布您的实体类以获取更多详细信息
  • 我已经更新了添加实体类的问题。请检查一下。 @JBNizet。
  • 更新了问题。贴出实体类。你能检查一下吗? @Baldurian。
  • 我的回答还是一样:你将一个字符串传递给 em.find(),但是 ID od Question 的类型是 int,因此是例外。只需阅读错误消息。 em.find() 的参数必须是整数类型。不是字符串。

标签: java spring hibernate


【解决方案1】:

正如@JB Nizet 指出的那样,观察实体,您正试图通过 id 查找问题发生

Question question = em.find(com.databaseproject.questor.model.Question.class, code);

传递作为字符串的“代码”。如果“code”代表id,你应该把它转换成一个int:

model.setViewName("question-list");
int id = 0;
try
{
    if(code != null)
      id = Integer.parseInt(code);
}
catch (NumberFormatException e)
{
    id = 0;
}
Question question = em.find(com.databaseproject.questor.model.Question.class, id);

处理一个可能未找到的问题。如果“代码”不是 id,您应该进行查询(使用标准、本机或 jpql)以获取问题实体列表以获取您需要的实体。

编辑 -> 获取问题实体列表:

TypedQuery<Question> query = em.createQuery("SELECT q FROM Question q WHERE q.Course_coursecode = :coursecode", Question.class);
query.setParameter("coursecode", code);
List<Question> results = query.getResultList();

【讨论】:

  • 'coursecode' 是名为'Course' 的表中的一列,它是主要的并且是字符串值。我在另一个表名“问题”中有这个作为外键。没有整数。我想用字符串值来搜索“CSE137”的出现。假设我有以下行: Course_coursecode 列中的 CSE136、CSE445、CSE987、CSE137、CSE137...。如果我想获得 CSE137 的出现,我应该怎么做,或者,我需要在我的代码中实现哪些更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2022-10-05
  • 2012-06-04
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多