出现以下错误消息
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而第二个字母大于问题似乎显示。属性名称如:
是o.k但是例如
不是。
这里可能会发生什么,如何调试这个以找出如何解决这个问题?
我猜测JavaBean规范大小写规则是这里的罪魁祸首 Where is the JavaBean property naming convention defined?
答案 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);
}