Java JPQL:未知状态或关联字段(EclipseLink)
我有一个从个人和组织单位继承的员工实体:Java JPQL:未知状态或关联字段(EclipseLink),java,hibernate,jpa,jpa-2.0,eclipselink,Java,Hibernate,Jpa,Jpa 2.0,Eclipselink,我有一个从个人和组织单位继承的员工实体: @MappedSuperclass public abstract class OrganizationalUnit implements Serializable { @Id private Long id; @Basic( optional = false ) private String name; public Long getId() { return this.id;
@MappedSuperclass
public abstract class OrganizationalUnit implements Serializable
{
@Id
private Long id;
@Basic( optional = false )
private String name;
public Long getId()
{
return this.id;
}
public void setId( Long id )
{
this.id = id;
}
public String getName()
{
return this.name;
}
public void setName( String name )
{
this.name = name;
}
// ...
}
组织单元:
@MappedSuperclass
public abstract class OrganizationalUnit implements Serializable
{
@Id
private Long id;
@Basic( optional = false )
private String name;
public Long getId()
{
return this.id;
}
public void setId( Long id )
{
this.id = id;
}
public String getName()
{
return this.name;
}
public void setName( String name )
{
this.name = name;
}
// ...
}
人:
@MappedSuperclass
public abstract class Person extends OrganizationalUnit
{
private String lastName;
private String firstName;
public String getLastName()
{
return this.lastName;
}
public void setLastName( String lastName )
{
this.lastName = lastName;
}
public String getFirstName()
{
return this.firstName;
}
public void setFirstName( String firstName )
{
this.firstName = firstName;
}
/**
* Returns names of the form "John Doe".
*/
@Override
public String getName()
{
return this.firstName + " " + this.lastName;
}
@Override
public void setName( String name )
{
throw new UnsupportedOperationException( "Name cannot be set explicitly!" );
}
/**
* Returns names of the form "Doe, John".
*/
public String getFormalName()
{
return this.lastName + ", " + this.firstName;
}
// ...
}
员工实体:
@Entity
@Table( name = "EMPLOYEES" )
@AttributeOverrides
(
{
@AttributeOverride( name = "id", column = @Column( name = "EMPLOYEE_ID" ) ),
@AttributeOverride( name = "name", column = @Column( name = "LASTNAME", insertable = false, updatable = false ) ),
@AttributeOverride( name = "firstName", column = @Column( name = "FIRSTNAME" ) ),
@AttributeOverride( name = "lastName", column = @Column( name = "LASTNAME" ) ),
}
)
@NamedQueries
(
{
@NamedQuery( name = "Employee.FIND_BY_FORMAL_NAME",
query = "SELECT emp " +
"FROM Employee emp " +
"WHERE emp.formalName = :formalName" )
}
)
public class Employee extends Person
{
@Column( name = "EMPLOYEE_NO" )
private String nbr;
// lots of other stuff...
}
然后,我尝试使用上面的查询按正式名称查找员工,例如“Doe,John”:
SELECT emp
FROM Employee emp
WHERE emp.formalName = :formalName
但是,在部署到EclipseLink时,这给了我一个例外:
Exception while preparing the app : Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Error compiling the query [Employee.FIND_BY_CLIENT_AND_FORMAL_NAME: SELECT emp FROM Employee emp JOIN FETCH emp.client JOIN FETCH emp.unit WHERE emp.client.id = :clientId AND emp.formalName = :formalName], line 1, column 115: unknown state or association field [formalName] of class [de.bnext.core.common.entity.Employee].
Local Exception Stack:
Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Error compiling the query [Employee.FIND_BY_CLIENT_AND_FORMAL_NAME: SELECT emp FROM Employee emp JOIN FETCH emp.client JOIN FETCH emp.unit WHERE emp.client.id = :clientId AND emp.formalName = :formalName], line 1, column 115: unknown state or association field [formalName] of class [de.bnext.core.common.entity.Employee].
Qs:
怎么了?是否禁止在JPQL中使用“人工”属性,这里是WHERE子句?这里是什么地方
我多次检查了大小写和拼写,运气不好。您的类没有formalName的映射,因此无法在查询中使用。您只能访问查询中的映射。数据库中没有正式名称,所以我不知道如何使用它 您的查询将需要更改以访问名字和姓氏,方法与您在getFormalName代码中尝试的方法相同:
"SELECT emp FROM Employee emp JOIN FETCH emp.client JOIN FETCH emp.unit WHERE emp.client.id = :clientId AND CONCAT(CONCAT(emp.lastName, ', '), emp.firstName) = :formalName"
请注意,OrganizationalUnit类的字段上有注释,因此只有字段才会有默认映射。这意味着您的表中将有firstName、LastName和Name字段,尽管getName在Person中将Name定义为This.firstName+“”+This.LastName。我建议您亲自删除firstName/lastName字段,而不是处理name字段,或者您可以从OrganizationalUnit中删除name字段,并让子类类以自己的方式处理get/setname访问器