意外的JPA错误:列名无效

时间:2011-02-13 12:22:12

标签: java hibernate jpa jboss ejb

使用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:com.mirs.ecms.db2.T04SysParms [select from com.mirs.ecms.db2.T04SysParms s WHERE s.key_Name ='EXECUTION_TIME'] < / p>


这是我的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

任何想法? 谢谢, 射线。

2 个答案:

答案 0 :(得分:1)

问题在于其中一个列名。确保您同时拥有VALUE列和KEY_NAME列。也可以将汽车视为具有案例敏感性。

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

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

答案 1 :(得分:0)

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

根据评论,这可能不是根本问题,但我认为避免保留字是健康的。

您一直在显示只获取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更合适。