【问题标题】:Composite primary key query复合主键查询
【发布时间】:2012-11-08 20:53:31
【问题描述】:

我有一个复合主键。键又是两个实体。我想根据主键内的实体进行查询。

我的意图是查询这样的主键

Criteria projCriteria = session.createCriteria(ProjectDetailsRO.class);
        projCriteria.createAlias("projectUsers", "projectUsers");
        projCriteria.add(Restrictions.eq("projectUsers.pk.users.email", leadUserEmail));

但我得到了一个例外 无法解析属性: pk.users.email 来自:com.ett.repository.ProjectUsers

我想根据用户(PK 类)进行查询。如何为 PK 类 (UserDetailsRO) 中的实体提供别名。请帮忙..!!

实体和关系如下

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

}

【问题讨论】:

    标签: hibernate hibernate-criteria composite-primary-key


    【解决方案1】:

    您没有提供 UserDetailsRO 类,因此我们假设其中的“电子邮件”属性是属性注释的。如果是这种情况,请尝试在您的标准中创建别名,直至“用户”。比如:

    Criteria projCriteria = session.createCriteria(ProjectDetailsRO.class);
    projCriteria.createAlias("projectUsers", "projectUsers");
    projCriteria.createAlias("pk", "projectUsers.pk");
    projCriteria.createAlias("users", "pk.users");
    projCriteria.add(Restrictions.eq("users.email", leadUserEmail));
    

    【讨论】:

    • 是的,这就是属性。我试着按照你说的做。 Iguess 属性名称和别名应该以另一种方式保留。即(projCriteria.createAlias(“projectUsers.pk”,“pk”);查询已生成,但在“where 子句”中给出错误 Unknown column 'users3_.EMAIL'
    • 查询生成选择 this_.PROJECT_ID 作为 PROJECT1_1_1_,this_.CREATED_DATE 作为 CREATED2_1_1_,this_.DESCRIPTION 作为 DESCRIPT3_1_1_,this_.NAME 作为 NAME1_1_,this_.TYPE 作为 TYPE1_1_,projectuse1_.project_id 作为 project2_6_0_,projectuse1_.user_id作为 user3_6_0_,projectuse1_.isLead 作为 isLead6_0_ 从 PROJECT_DTLS this_ 内部加入 PROJECT_USERS projectuse1_ on this_.PROJECT_ID=projectuse1_.project_id where users3_.EMAIL=?和 projectuse1_.isLead=?它给出了错误
    • 你能告诉我我哪里出错了吗?如果我需要提供更多详细信息,请告诉我。
    • 那个 sql 查询看起来有缺陷......'where' 子句引用了一个别名为 'users3_' 的表,但在 'from'/'join' 子句中没有声明。用户表是在 Hibernate 中映射的吗?
    • 是的,用户表已映射。我需要根据 UserDetailsRO 中的用户名进行查询。
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2012-03-18
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多