SQLGrammarException:无法执行查询:找不到列?

Posted

技术标签:

【中文标题】SQLGrammarException:无法执行查询:找不到列?【英文标题】:SQLGrammarException: could not execute query: Column not found? 【发布时间】:2020-08-17 15:43:38 【问题描述】:

我有以下hibernate 查询字符串:

 String queryString = "select \r\n" +
                    "cms.my_status_id as 'myStatusId',\r\n" +
                    "cms.status_label as 'statusLabel',\r\n" +
                    "csl.status_id as 'companyStatusLabel'\r\n" +
                    "from "+client+".corresponding_status cms \r\n" +
                    "join "+client+".company_status_label csl on csl.status_id = cms.my_status_id";

我的对应实体是:

@Entity(name = "corresponding_status")
@Table(name = "corresponding_status")
public class CorrespondingStatus implements Serializable 

    @Id
    @JsonProperty
    @Column(name = "my_status_id")
    private Integer myStatusId;

    // varchar(255)
    @JsonProperty
    @Column(name = "status_label")
    private String statusLabel;

    @JsonProperty
    @Transient
    private String companyStatusLabel;

但是,当我运行查询时,我得到:

Column 'my_status_id' not found

即使它肯定在数据库中。

这里有什么问题?

【问题讨论】:

你能告诉我们最后的查询吗? @jarlh 我该怎么做?谢谢 将您的日志输出粘贴到问题中 \r\n 完全没有必要,可能会引起问题 您的CorrespondingStatus 实体似乎与任何其他实体没有关系。你为什么要在这里加入? 【参考方案1】:

在 HQL 中,您必须使用属性而不是数据库列名。将您的 HQL 更改为

String queryString = "select \r\n" +
                "cms.myStatusId as 'myStatusId',\r\n" +
                "cms.statusLabel as 'statusLabel',\r\n" +
                "csl.status_id as 'companyStatusLabel'\r\n" +
                "from "+client+".corresponding_status cms \r\n" +
                "join "+client+".company_status_label csl with csl.status_id = cms.myStatusId";

编辑: 您可能需要相应地更改 company_status_label 实体

EDIT2:更改为 WITH

【讨论】:

HQL 连接没有ON 子句。【参考方案2】:

我建议使用criteria API,而不是手动构建 JPA 查询。您上面的查询将从:

String queryString = "select \r\n" +
                    "cms.my_status_id as 'myStatusId',\r\n" +
                    "cms.status_label as 'statusLabel',\r\n" +
                    "csl.status_id as 'companyStatusLabel'\r\n" +
                    "from "+client+".corresponding_status cms \r\n" +
                   "join "+client+".company_status_label csl on csl.status_id = cms.my_status_id";

类似于:

Session session = HibernateUtil.getHibernateSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Entity> cq = cb.createQuery(Entity.class);
Root<Entity> root = cq.from(Entity.class);
cq.select(root);
Query<Entity> query = session.createQuery(cq);
List<Entity> results = query.getResultList();

【讨论】:

以上是关于SQLGrammarException:无法执行查询:找不到列?的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.exception.SQLGrammarException:无法插入

org.hibernate.exception.SQLGrammarException: could not execute query

org.hibernate.exception.SQLGrammarException:无法提取 ResultSet

无法打开 JPA EntityManager 进行事务处理;嵌套异常是 org.hibernate.exception.SQLGrammarException:无法获取 JDBC 连接

无法从 Hibernate 工具执行简单的 HQL 查询

Hibernate - OneToMany 单向映射 - SQLGrammarException