3

出现以下错误信息

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); 
  }

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

  • 社会保障号
  • 电子邮件状态

还可以,但是例如

  • 电子邮件状态
  • x状态

不是。

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

我猜 JavaBean 规范的大写规则是罪魁祸首,正如 JavaBean 属性命名约定在哪里定义的评论中所概述的那样?

4

1 回答 1

4

条件查询片段:

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

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

Introspector decapitalize 函数在这里可能会有所帮助。

它还可以将列重命名为“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); 
  }
于 2013-02-13T17:43:01.880 回答