出现以下错误信息
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);
}