Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate + composite-id + select query


Автор: Crocodile 16.8.2007, 19:26
У меня такая проблема. Есть таблица с первичным ключем с нескольких столбцов. Все работает если делаю такие действия:

Код

ProjectMemberKey key = new ProjectMemberKey("1234", "Admin");        
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
ProjectMember member = (ProjectMember) session.load(ProjectMember.class, key);
session.close();
sessionFactory.close();


или такое тоже работает

Код
        
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
[B]List<Object> list = session.createQuery("select projectMemberKey from ProjectMember").list();[B]
session.close();
sessionFactory.close();


Но как мне писать SQL queries ecли мне надо выбрать столбцы с ключя. То есть такое неработает:
Код
        
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
[B]List<Object> list = session.createQuery("select Member from ProjectMember where RoleInProject='Manager'").list();[B]
session.close();
sessionFactory.close();






ProjectMember.java
Код

package db.table;

import db.tablekey.ProjectMemberKey;

/* Represents ProjectMember table in database IBM */
public final class ProjectMember {
    private static final long serialVersionUID = 100L;

    private ProjectMemberKey projectMemberKey;
    // Post VARCHAR(150) NOT NULL
    private String post = new String();
    // RoleInProject CHAR(7) NOT NULL
    private String roleInProject = Roles.MEMBER.getValue();
    

    private ProjectMember() {
    }
    public ProjectMember(ProjectMemberKey key, String post,
            Roles roleInProject) {
        setProjectMemberKey(key);
        setPost(post);
        setRoleInProject(roleInProject.getValue());
    }
    
    
    public ProjectMemberKey getProjectMemberKey() {
        return projectMemberKey;
    }
    public void setProjectMemberKey(ProjectMemberKey projectMemberKey) {
        this.projectMemberKey = projectMemberKey;
    }
        
    public String getPost() {
        return post;
    }
    public void setPost(String post) {    
        this.post = post.length() > 150 ? this.post : post;
    }
    
    public String getRoleInProject() {
        return roleInProject;
    }
    public void setRoleInProject(String roleInProject) {
        this.roleInProject = roleInProject;
    }
    
}
    


ProjectMemberKey.java
Код

package db.tablekey;

import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;


public class ProjectMemberKey implements Serializable {
    private static final long serialVersionUID = 100L;

    // Project VARCHAR(250)        NOT NULL
    private String projectId;
    // Member VARCHAR(100) NOT NULL
    private String member = new String();
    
    
    private ProjectMemberKey() {
    }
    public ProjectMemberKey(String project, String member) {
        setProjectId(project);
        setMember(member);
    }
    
    public String getProjectId() {
        return projectId;
    }
    public void setProjectId(String projectId) {        
        this.projectId = projectId;
    }
    
    public String getMember() {
        return member;
    }
    public void setMember(String member) {
        this.member = member.length() > 100 ? this.member : member;
    }
    
        
    public boolean equals(Object other) {
        if (!(other instanceof ProjectMemberKey))
         return false;
        ProjectMemberKey castOther = (ProjectMemberKey)other;        
        return new EqualsBuilder()
            .append(this.getProjectId(), castOther.getProjectId())
            .append(this.getMember(), castOther.getMember())
            .isEquals();
    }
    public int hashCode() {
        return new HashCodeBuilder()
            .append(getProjectId())
            .append(getMember())
            .toHashCode();
    }
        
}
    


ProjectMember.hbm.xml
Код

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="db.table.ProjectMember" table="ProjectMember">
        <composite-id name="projectMemberKey" class="db.tablekey.ProjectMemberKey"> 
         <key-property name="projectId" type="string" column="ProjectId"/> 
         <key-property name="member" type="string" column="Member"/>           
        </composite-id> 
        <property name="post" type="string" column="Post" not-null="true"/>
        <property name="roleInProject" type="string" column="RoleInProject" not-null="true"/>
    </class>

</hibernate-mapping>



Автор: AlexeyVorotnikov 16.8.2007, 20:59
А что оно говорит? Или ничего не говорит? А что в логе пишет?

Автор: Crocodile 20.8.2007, 15:30
Код

javax.servlet.ServletException: No data type for node: org.hibernate.hql.ast.tree.IdentNode 
 \-[IDENT] IdentNode: 'ProjectId' {originalText=ProjectId}

    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)


root cause 

java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode 
 \-[IDENT] IdentNode: 'ProjectId' {originalText=ProjectId}

    org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:145)
    org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:705)
    org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:529)
    org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:645)
    org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
    org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
    org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
    org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
    org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
    org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
    org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
    org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)


Help please:)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)