I have a composite primary key. The keys are in turn two entities. I want to query based on the entities inside the primary key.
My intention is to query on the primary key something like this
Criteria projCriteria = session.createCriteria(ProjectDetailsRO.class);
projCriteria.createAlias("projectUsers", "projectUsers");
projCriteria.add(Restrictions.eq("projectUsers.pk.users.email", leadUserEmail));
But I get an exception could not resolve property: pk.users.email of: com.ett.repository.ProjectUsers
I want to query based on the user(of PK class). How to give Alias for the entity which is inside the PK class(UserDetailsRO). PLEASE HELP..!!
The entities and the relations are as below
@Entity
@Table(name="PROJECT_USERS")
@AssociationOverrides({
@AssociationOverride(name="pk.users", joinColumns=@JoinColumn(name="user_id")),
@AssociationOverride(name="pk.project", joinColumns=@JoinColumn(name="project_id"))
})
public class ProjectUsers {
private ProjectUserPK pk= new ProjectUserPK();
@EmbeddedId
public ProjectUserPK getPk() {
return pk;
}
public void setPk(ProjectUserPK pk) {
this.pk = pk;
}
@Transient
public ProjectDetailsRO getProjects() {
return getPk().getProject();
}
public void setProjects(ProjectDetailsRO projects) {
getPk().setProject(projects);
}
@Transient
public UserDetailsRO getUsers() {
return getPk().getUsers();
}
public void setUsers(UserDetailsRO users) {
getPk().setUsers(users);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((isLead == null) ? 0 : isLead.hashCode());
result = prime * result + ((pk == null) ? 0 : pk.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ProjectUsers other = (ProjectUsers) obj;
if (isLead == null) {
if (other.isLead != null)
return false;
} else if (!isLead.equals(other.isLead))
return false;
if (pk == null) {
if (other.pk != null)
return false;
} else if (!pk.equals(other.pk))
return false;
return true;
}
}
THE PRIMARY KEY CLASS
----------------------
@Embeddable
public class ProjectUserPK implements Serializable{
private ProjectDetailsRO project;
private UserDetailsRO users;
@ManyToOne
public ProjectDetailsRO getProject() {
return project;
}
public void setProject(ProjectDetailsRO project) {
this.project = project;
}
@ManyToOne
public UserDetailsRO getUsers() {
return users;
}
public void setUsers(UserDetailsRO users) {
this.users = users;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((project == null) ? 0 : project.hashCode());
result = prime * result + ((users == null) ? 0 : users.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ProjectUserPK other = (ProjectUserPK) obj;
if (project == null) {
if (other.project != null)
return false;
} else if (!project.equals(other.project))
return false;
if (users == null) {
if (other.users != null)
return false;
} else if (!users.equals(other.users))
return false;
return true;
}
}
The Main ENtity
=====================
@Entity
@Table(name="PROJECT_DTLS")
public class ProjectDetailsRO {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="PROJECT_ID")
private Long projectId;
@OneToMany(fetch=FetchType.LAZY, mappedBy="pk.project", cascade=CascadeType.ALL)
private List<ProjectUsers>projectUsers = new LinkedList<ProjectUsers>();
public void addUser(UserDetailsRO user, Character lead){
ProjectUsers association = new ProjectUsers();
association.setUsers(user);
association.setProjects(this);
association.setIsLead(lead);
this.projectUsers.add(association);
user.getProjectUsers().add(association);
}
public List<ProjectUsers> getProjectUsers() {
return projectUsers;
}
public void setProjectUsers(List<ProjectUsers> projectUsers) {
this.projectUsers = projectUsers;
}
}