出现以下错误信息

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,第二个字母为大写,则该问题似乎显示出来。属性名称,例如:


社交网络
电子邮件状态


是的,但例如


邮件状态
状态


不是。

这可能是怎么回事,我该如何调试它以找出解决方法?

我猜想JavaBean规范大写规则是此处的罪魁祸首,在
Where is the JavaBean property naming convention defined?

最佳答案

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

07-26 04:47