【问题标题】:Unexpected JPA error:Invalid column name意外的 JPA 错误:列名无效
【发布时间】:2011-06-26 10:13:56
【问题描述】:

使用jboss5.1.x、ejb3.0

这让我疯狂了两天:

我正在尝试简单的 where 子句查询,但我不断收到该错误:


这是我通过 JPSQL 查询得到的结果:

       String queString ="select s from T04SysParms s WHERE s.key_Name='EXECUTION_TIME'"; 
        Query q = em.createQuery(queString); 
        List<T04SysParms> results = (List<T04SysParms>) q.getResultList(); 

我得到的异常:

org.hibernate.QueryException: 无法解析属性: key_Name of: com.mirs.ecms.db2.T04SysParms [select s from com.mirs.ecms.db2.T04SysParms s WHERE s.key_Name='EXECUTION_TIME']


这是我的 mappe 类:

@Entity
@Table(name = "T04_SYS_PARMS", schema = "ECMS")
public class T04SysParms implements java.io.Serializable
{

// Fields

private String key_Name;
private String value_Name;

// Constructors

/** default constructor */
public T04SysParms()
{
}

/** minimal constructor */
public T04SysParms(String keyName)
{
    this.key_Name = keyName;
}

/** full constructor */
public T04SysParms(String keyName, String valueName)
{
    this.key_Name = keyName;
    this.value_Name = valueName;
}

// Property accessors
@Id
@Column(name = "KEY_NAME", unique = true, nullable = false, length = 100)
public String getKeyName()
{
    return this.key_Name;
}

public void setKeyName(String keyName)
{
    this.key_Name = keyName;
}

@Column(name = "VALUE_NAME", length = 200)
public String getValueName()
{
    return this.value_Name;
}

public void setValueName(String valueName)
{
    this.value_Name = valueName;
}

}

数据库中的实际表名:T04_SYS_PARMS 映射的表名是:T04SysParms

有什么想法吗? 谢谢, 射线。

【问题讨论】:

  • 您从该表 (T04_SYS_PARMS) 中仅选择 VALUE,我怀疑您是否可以使用单个列创建 T04SysParms 的完整对象。我猜是impl。至少还需要选择标识列。

标签: java hibernate jpa jboss ejb


【解决方案1】:

问题在于其中一个列名。确保您同时拥有 VALUE 列和 KEY_NAME 列。还要带车,以免区分大小写。

顺便说一句,我不明白为什么您需要在这里使用本机查询。不能使用 JPQL 查询吗?请注意,在 JPQL 查询中,您必须引用类和字段而不是表和列。所以不是KEY,而是key

顺便说一句,KEY 有时会被数据库保留(如其他人建议的 VALUE)。怎么样 - 打开一些数据库管理员工具并尝试运行查询。只有在它工作后才能将其移至您的代码中。

【讨论】:

  • 我确实有 VALUE 和 KEY_NAME 列,我已经确认了。我已经编辑了关于 JPQL 的问题
  • @rayman - 我仍然看到KEY,这不太可能是类字段名称。顺便看看我的更新
  • 我直接在数据库编辑器中执行了 sql 命令,效果很好。
【解决方案2】:

VALUE 是 sql 标准中的保留字。你真的有一个名为那个的列吗?如果是这样,您可能需要在查询中引用它。或者更好的是,将其更改为更有意义的名称。

基于 cmets,这可能不是根本问题,尽管我认为避免保留字是健康的。

您也一直在显示仅获取 VALUE_NAME 字段的查询,但随后您试图从结果中提取整个 T04SysParms。

根据包括映射在内的更新,查询的 JPQL 版本:

String queString ="select s from T04SysParms WHERE s.keyName='EXECUTION_TIME'";
Query q = em.createQuery(queString);
List<T04SysParms> results = (List<T04SysParms>) q.getResultList();

应该给你一个符合你需要的 T04SysParms 对象列表。

应该可以用 SQL 表单做类似的事情(调整它以获取所有字段),但要获取实体而不是单个字段,JPQL 更合适。

【讨论】:

  • 我将其更改为“VALUE_NAME”,但我仍然得到 org.hibernate.QueryException: could not resolve property: KEY_NAME of: com.mirs.ecms.db2.T04SysParms [select VALUE_NAME from com.mirs. ecms.db2.T04SysParms SYS WHERE SYS.KEY_NAME ='EXECUTION_TIME']
  • 这看起来像 Hibernate 期望在实体中看到一个名为 KEY_NAME 的 java 属性,但没有找到它。如果您使用的是 JPQL,则需要使用 Java 属性名称。
  • 我做了..但我仍然得到:org.hibernate.QueryException:无法解析属性:KEY_NAME of:com.mirs.ecms.db2.T04SysParms [从 com.mirs.ecms 中选择 VALUE_NAME。 db2.T04SysParms SYS WHERE SYS.KEY_NAME ='EXECUTION_TIME'] 我将使用映射类编辑我的问题
  • 好主意。拥有地图将有助于提出建议。
  • 对不起,我错误地删除了你的最后一条评论,无论如何:这就是我得到的:org.hibernate.QueryException: Unable to resolve path [s.key_Name], unexpected token [s] [select s from com .mirs.ecms.db2.T04SysParms WHERE s.key_Name='EXECUTION_TIME']
猜你喜欢
  • 2023-03-19
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多