【问题标题】:Caused by: java.sql.SQLException: Column 'id' not found引起:java.sql.SQLException:找不到列'id'
【发布时间】:2016-03-13 21:01:44
【问题描述】:

我想获取一些字段,然后将其设置为我的 Test.entity。我的 SQL 查询:

                query = "SELECT t.id as tId, t.test_name, t.duration, q.id as qId, " +
                    "q.question as question, q.is_multichoice as is_multichoice, " +
                    "q.is_open as is_open, a.id as aId, a.answer_text as answer_text  FROM result r " +
                    "JOIN test t ON r.test_id = t.id " +
                    "JOIN user u ON r.user_id = u.id " +
                    "JOIN question q ON t.id = q.test_id JOIN answer a ON q.id = a.question_id " +
                    "WHERE t.id = :testId AND u.id = :userId AND r.permission = :permissionId " +
                    "AND q.archived = false AND a.archived = false", resultClass = com.bionic.entities.Test.class)

测试实体:

public class Test {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "duration", nullable = false)
private int duration;
@Column(name = "test_name", nullable = false, unique = true)
private String testName;
@Column(name = "archived", nullable = false)
private boolean archived;
@OneToMany(mappedBy = "test", fetch = FetchType.EAGER)
private Set<Question> questions;
@ManyToMany(mappedBy = "tests")
private Set<User> users;

问题实体:

public class Question {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "is_multichoice", nullable = false)
private boolean isMultichoice;
@Column(name = "is_open", nullable = false)
private boolean isOpen;
@Column(name = "picture")
private String picture;
@Column(name = "question")
private String question;
@ManyToOne
@JoinColumn(name = "test_id", nullable = false)
private Test test;
@Column(name = "archived", nullable = false)
private boolean isArchived;
@OneToMany(mappedBy = "question", fetch = FetchType.EAGER)
private Set<Answer> answers;

回答实体:

public class Answer {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "answer_text", nullable = false)
private String answerText;
@Column(name = "mark", nullable = false)
private int mark;
@ManyToOne
@JoinColumn(name = "question_id")
private Question question;
@Column(name = "picture")
private String picture;
@Column(name = "archived", nullable = false)
private boolean isArchived;

但是,执行此查询后,我得到了异常:

Caused by: java.sql.SQLException: Column 'id' not found.

DAO.class:

    public Test getCurrentTest(long id, long testId, long permissionId) {
    Query query = em.createNamedQuery("getCurrentTestById");
    query.setParameter("userId", id);
    query.setParameter("testId", testId);
    query.setParameter("permissionId", permissionId);
    return (Test) query.getSingleResult();
}

我做错了什么?

【问题讨论】:

  • 请确保您的所有表都有名为 id 的列

标签: java sql hibernate entity


【解决方案1】:

您的查询未返回名为 id 的字段。它有名为aId, qId, and tId 的字段。

您需要在实体中使用正确的列名。例如,在您的测试实体中,您声明了一个名为 id 的列。除了您的查询不返回名为 id 的列外,它会返回名为 tId 的列。请参阅下面的示例,了解需要更改的内容。

public class Test {
@tId
@Column(name = "tId")
@GeneratedValue(strategy = GenerationType.AUTO)
private long tId;
 .... 

【讨论】:

  • 如何将其映射到我在实体中提交的 id?
  • 我的意思是我有 3 个字段称为 id (test, question, aswer),但我无法通过 SQL 查询获得 3 个具有相同名称“id”的字段
  • 我明白这一点。这就是为什么你给这 3 个字段起别名。从而更改字段的名称,使它们是唯一的。但这也意味着您的代码看不到名为 id 的字段。您需要通过其新别名引用该字段。
  • 我应该为此使用 SqlResultSetMappings 还是重命名每个实体中的字段(我不喜欢这个变体)如果我应该使用 SqlResultSetMappings,我该如何设置答案和问题的字段,因为它们是子实体跨度>
  • 您需要在实体中使用正确的列名。例如,在您的测试实体中,您声明了一个名为 id 的列。除了您的查询不返回名为 id 的列外,它会返回名为 tId 的列。
猜你喜欢
  • 2019-11-11
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多