来自托管类型[...]的属性[...]不存在(对于具有lowerCase / upperCase名称的字段

时间:2013-02-13 11:41:03

标签: jpa

出现以下错误消息

java.lang.IllegalArgumentException: 
The attribute [eMailStatus] 
from the managed type [EntityTypeImpl@902966747:PersonJpaDao 
   [ javaType: class com.bitplan.smartCRM.jpa.PersonJpaDao descriptor: 
   RelationalDescriptor(com.bitplan.smartCRM.jpa.PersonJpaDao --> [DatabaseTable(Person)]),  
   mappings: 46]] 
is not present.
    at 
 org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl.getAttribute(ManagedTypeImpl.java:147)

虽然存在注释和getter以及setter:

 /**
   * getter for xsd:string/String EMailStatus
   * @return eMailStatus
   */
  @Column(name="eMailStatus")
  public String getEMailStatus() { 
    return getPersonImpl().getEMailStatus(); 
  }

  /**
   * setter for xsd:string/String EMailStatus
   * @param peMailStatus - new value for EMailStatus
   */
  public void setEMailStatus(String peMailStatus) { 
    getPersonImpl().setEMailStatus(peMailStatus); 
  }

我的假设是该字段的命名是相关的: 如果该字段的第一个字母是lowerCase而第二个字母大于问题似乎显示。属性名称如:

  • SSN
  • EMailStatus

是o.k但是例如

  • eMailStatus
  • xStatus

不是。

这里可能会发生什么,如何调试这个以找出如何解决这个问题?

我猜测JavaBean规范大小写规则是这里的罪魁祸首 Where is the JavaBean property naming convention defined?

1 个答案:

答案 0 :(得分:4)

Criteria查询摘要:

Path<String> beanValue = qh.from.<String> get(beanField);

必须使用EMailStatus而不是eMailStatus作为beanField内容 - 即使该属性的名称是eMailStatus,并且由于java bean约定,只有getter具有upperCase“E”。我还没有找到原因 - 所以其他答案仍然受到赞赏。

Introspector decapitalize function可能对此有所帮助。

它也可以将列重命名为“EMailStatus”:

  /**
   * getter for xsd:string/String EMailStatus
   * @return eMailStatus
   */
  @Column(name="EMailStatus")
  public String getEMailStatus() { 
    return getPersonImpl().getEMailStatus(); 
  }

  /**
   * setter for xsd:string/String EMailStatus
   * @param peMailStatus - new value for EMailStatus
   */
  public void setEMailStatus(String peMailStatus) { 
    getPersonImpl().setEMailStatus(peMailStatus); 
  }