2012-03-15 3 views
0

I STUDENT(studentId,studentName,courseId)と呼ばれる2つのテーブル、mysql.IでCOURSE(courseId,courseName)がように述べたテーブル用の2つの.javaファイルがあります:HQL(注釈)を使用して2つのテーブルからデータを動的にフェッチする方法は?私は詳細を掲載してい

Student.java

package com.vaannila.course; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import org.hibernate.annotations.*; 

@Entity 
@Table(name="STUDENT") 
public class Student { 

private long courseId; 
private String studentName; 
private long studentId; 

public Student() { 
} 

@Id 
@Column(name="studentId") 
public long getStudentId() { 
    return this.studentId; 
} 

public void setStudentId(long studentId) { 
    this.studentId = studentId; 
} 

@Column(name="studentName", nullable=false) 
public String getStudentName() { 
    return this.studentName; 
} 

public void setStudentName(String studentName) { 
    this.studentName = studentName; 
} 

@Column(name="courseId") 
public long getCourseIdStu() { 
    return this.courseId; 
} 

public void setCourseIdStu(long courseId) { 
    this.courseId = courseId; 
} 

} 

Course.java

package com.vaannila.course; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="COURSE") 
public class Course { 

private long courseId; 
private String courseName; 

public Course() { 
} 

public Course(String courseName) { 
    this.courseName = courseName; 
} 
@Id 
@Column(name="courseId") 
public long getCourseId() { 
    return this.courseId; 
} 

public void setCourseId(long courseId) { 
    this.courseId = courseId; 
} 

@Column(name="courseName", nullable=false) 
public String getCourseName() { 
    return this.courseName; 
} 

public void setCourseName(String courseName) { 
    this.courseName = courseName; 
} 

} 

hibernate.cfg.xmlファイルは

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/emp</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="connection.password">aktpl</property> 
    <property name="show.sql" >true</property> 
    <mapping class="com.vaannila.course.Course"/> 
    <mapping class="com.vaannila.course.Student"/> 
    </session-factory> 
があります

そして、私のHQLは、次のとおりです。

(SNAME iはsetParameterを()を使用して設定され、ここで入力されている) String hql = "SELECT s.studentName,c.courseName FROM Student s,Course c where s.courseId=c.courseId and s.studentName=':sname'";が、私はこのエラーを抱えている:

org.hibernate.QueryException: could not resolve property: courseId of: com.vaannila.course.Student  [SELECT s.studentName,c.courseName FROM com.vaannila.course.Student s,com.vaannila.course.Course c where s.courseId=c.courseId and s.studentName=':sname'] 
at   org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) 
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77) 
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1809) 
at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:313) 
at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:485) 
at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:598) 
at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:266) 
at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:213) 
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:118) 
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114) 
at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:883) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1246) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4252) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3730) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1923) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1848) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:782) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:583) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:287) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119) 
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214) 
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192) 
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537) 
at com.vaannila.course.Main.searchResult(Main.java:184) 
at Action.ShowStu.doPost(ShowStu.java:56) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744) 
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) 
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) 
at java.lang.Thread.run(Thread.java:619) 

私が表示したいです'studentName'属性と 'courseName'属性を持つテーブル。 私を助けてください!事前にお越しいただきありがとうございます

答えて

2

学生の注釈付きゲッターはgetCourseIdStu()と呼ばれています。つまり、このプロパティの名前はcourseIdStu(これは奇形名BTWです)です。このため、このプロパティ名をHQLで使用する必要があります。

また、パラメータの前後に一重引用符は必要ありません。クエリは、このようにする必要があります:あなたがオブジェクトデータベースのに上のグラフではなく、他のオブジェクトのIDを含むだけで個々のオブジェクトを提供することにある休止状態の一つの重要な部分を、逃した

select s.studentName, c.courseName from Student s, Course c 
where s.courseIdStu = c.courseId and s.studentName = :sname 

注意。あなたは学生にcourseIdを持ってはいけません。

@ManyToOne 
@JoinColumn(name = "courseId") 
public Course getCourse() { 
    return this.course; 
} 

これは、データベースからの学生を取得し、そのコースにナビゲートすることができます:代わりに、コースと(多対1)の関連を持っている必要があります。あなたが持っていたクエリは、次のように書き直すことができます:

select s.studentName, c.courseName from Student s 
inner join s.course c 
where s.studentName = :sname 
関連する問題