-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: How to make HQL query using composite key annotation
PostPosted: Tue Feb 08, 2011 5:52 am 
Newbie

Joined: Tue Feb 08, 2011 5:34 am
Posts: 1
Hi

I have searched the internet for how to make a HQL query for a table which has a composite primary key.

I have done the following:

This is my table definition:
create table experience (project_id integer, person_id integer, competence_id integer, grade_id integer, from_date date, to_date date, description varchar(400), unique(project_id, person_id, competence_id));

--------------------------------------------------------------------------------------------------------
Experience.java

package experience;

import java.util.Date;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "experience")
public class Experience
{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="project_id", column=@Column(name="project_id")),
@AttributeOverride(name="person_id", column=@Column(name="person_id")),
@AttributeOverride(name="competence_id", column=@Column(name="competence_id"))})

private ExperienceId experienceId;

@Column(name = "grade_id")
private Long gradeId;

@Column(name = "from_date")
private Date fromDate;

@Column(name = "to_date")
private Date toDate;

@Column(name = "description")
private String description;

@Id
public ExperienceId getExperienceId() {
return experienceId;
}

public void setExperienceId(ExperienceId experienceId) {
this.experienceId = experienceId;
}

public Long getGradeId() {
return gradeId;
}

public void setGradeId(Long gradeId) {
this.gradeId = gradeId;
}

public Date getFromDate() {
return fromDate;
}

public void setFromDate(Date fromDate) {
this.fromDate = fromDate;
}

public Date getToDate() {
return toDate;
}

public void setToDate(Date toDate) {
this.toDate = toDate;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}
}

--------------------------------------------------------------------------------------------------------
I have ExperienceId.java

package experience;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;


@Embeddable
public class ExperienceId implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;

@Column(name="project_id")
private Long projectId;

@Column(name="person_id")
private Long personId;

@Column(name="competence_id")
private Long competenceId;

public ExperienceId(Long projectId, Long personId, Long competenceId)
{
this.projectId = projectId;
this.personId = personId;
this.competenceId = competenceId;
}


public Long getProjectId() {
return projectId;
}


public void setProjectId(Long projectId) {
this.projectId = projectId;
}


public Long getPersonId() {
return personId;
}


public void setPersonId(Long personId) {
this.personId = personId;
}


public Long getCompetenceId() {
return competenceId;
}


public void setCompetenceId(Long competenceId) {
this.competenceId = competenceId;
}


@Override
public boolean equals(Object arg0)
{
if(arg0 == null)
return false;
if(!(arg0 instanceof Experience))
return false;

ExperienceId arg1 = (ExperienceId)arg0;

return (this.projectId.longValue() == arg1.getProjectId().longValue() &&
this.personId.longValue() == arg1.getPersonId().longValue() &&
this.competenceId.longValue() == arg1.getCompetenceId().longValue());
}

@Override
public int hashCode()
{
int hsCode = projectId.hashCode() + 19 * personId.hashCode() + 31 * competenceId.hashCode();

return hsCode;
}
}


---------------------------------------------------------------------------

Then I have a method (in another class)

public Experience findByExperienceId(ExperienceId experienceId)
{
return (Experience)getCurrentSession().createQuery("from Experience as e where e.experienceId.project_id = :projectId and e.experienceId.person_id = :personId and e.experienceId.competence_id = :competenceId").setLong("projectId", experienceId.getProjectId()).setLong("personId", experienceId.getPersonId()).setLong("competenceId", experienceId.getCompetenceId()).uniqueResult();
}

But I get the following exception

org.hibernate.QueryException: could not resolve property: experienceId.project_id of: experience.Experience [from experience.Experience as e where e.experienceId.project_id = :projectId and e.experienceId.person_id = :personId and e.experienceId.competence_id = :competenceId]
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:59)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1344)
at org.hibernate.hql.ast.tree.FromElementType.toColumns(FromElementType.java:317)
at org.hibernate.hql.ast.tree.FromElementType.toColumns(FromElementType.java:292)
at org.hibernate.hql.ast.tree.FromElement.toColumns(FromElement.java:393)
at org.hibernate.hql.ast.tree.DotNode.getColumns(DotNode.java:111)
at org.hibernate.hql.ast.tree.DotNode.initText(DotNode.java:230)
at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:205)
at org.hibernate.hql.ast.tree.DotNode.resolveFirstChild(DotNode.java:153)
at org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:530)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4543)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1289)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3722)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1864)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1789)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1789)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:818)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:604)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:231)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:162)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:113)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1624)
at experience.HibernateExperienceRepository.findByExperienceId(HibernateExperienceRepository.java:22)
at experience.ExperienceTest.findExperience(ExperienceTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

What do I need to do?


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.