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?
|