首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate中关于hql的一个有关问题。

2012-10-07 
hibernate中关于hql的一个问题。。。。在hibernate中的以下中hql语句出错:Exception in thread main java.la

hibernate中关于hql的一个问题。。。。
在hibernate中的以下中hql语句出错:Exception in thread "main" java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode \-[IDENT] IdentNode: 'sno' {originalText=sno}
{
SessionFactory sf = new Configuration().configure()
.buildSessionFactory();
        Session session = sf.openSession();
       // String hql="from Student s where s.sdept in(select s.sdept from s where s.sname='张三')";
        String hql="from Student s where s.sno in (select sno from Sc  where cno='1')";
        Query query=session.createQuery(hql);
        List list=query.list();
        Iterator it=list.iterator();
        while(it.hasNext())
        {
        Student stu=(Student) it.next();
        System.out.println(stu.getSname()+"\t"+stu.getSdept());
        }
}

打开Sc.hbm.xml中发现没有sno属性,其内容为:<?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">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.yan.hibernate.Sc" table="sc" catalog="lrdatabase">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator />
        </id>
        <many-to-one name="course" fetch="select">
            <column name="cno" />
        </many-to-one>
        <many-to-one name="student" fetch="select">
            <column name="sno" />
        </many-to-one>
        <property name="grade" type="java.lang.Integer">
            <column name="grade" />
        </property>
    </class>
</hibernate-mapping>

[color=darkred]解决方法是:
将hql语句改为:String hql="from Student s where s.sno in (select student.sno from Sc  where cno='1')";[/color]
数据库中建表的情况如下:数据库中建立了三个表student、course、sc表,其关系是sc中的外键sno对应于student表中的sno,sc中的外键cno对应于course中cno,其建表过程为:
/*
MySQL Data Transfer
Source Host: localhost
Source Database: lrdatabase
Target Host: localhost
Target Database: lrdatabase
Date: 2010-4-2 15:49:33
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
CREATE TABLE `course` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `cno` int(10) DEFAULT NULL,
  `cname` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `ccredit` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `cno` (`cno`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk;

-- ----------------------------
-- Table structure for sc
-- ----------------------------
CREATE TABLE `sc` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `sno` int(10) DEFAULT NULL,
  `cno` int(10) DEFAULT NULL,
  `grade` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `sno` (`sno`),
  KEY `cno` (`cno`),
  CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`sno`) REFERENCES `student` (`sno`),
  CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`cno`) REFERENCES `course` (`cno`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;

-- ----------------------------
-- Table structure for student
-- ----------------------------
CREATE TABLE `student` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `sno` int(10) DEFAULT NULL,
  `sname` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `ssex` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
  `sdept` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
  `sage` int(10) DEFAULT NULL,
  `saddress` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `sno` (`sno`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk;

-- ----------------------------
-- Table structure for user
-- ----------------------------
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `phonetype` tinyint(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=gbk;

-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `course` VALUES ('1', '1', '数据库', '2');
INSERT INTO `course` VALUES ('2', '2', '操作系统', '2');
INSERT INTO `course` VALUES ('3', '3', '软件工程', '3');
INSERT INTO `sc` VALUES ('1', '1', '1', '86');
INSERT INTO `student` VALUES ('1', '1', '张三', '男', '计算机', '20', '北京市');
INSERT INTO `student` VALUES ('2', '2', '李四', '女', '计算机', '21', '河北');
INSERT INTO `student` VALUES ('3', '3', '王五', '女', '法学', '20', '北京市');
INSERT INTO `user` VALUES ('9', '李四', '1', '1');
INSERT INTO `user` VALUES ('10', '王五', '1', '1');
INSERT INTO `user` VALUES ('11', '你好。', '1', '2');
INSERT INTO `user` VALUES ('12', '你好啊。', 'aaa', '1');
INSERT INTO `user` VALUES ('13', 'hello', 'aaa', '1');
INSERT INTO `user` VALUES ('14', 'hello', 'a', '1');
INSERT INTO `user` VALUES ('15', 'hsdfgdsg', '3242', '1');
INSERT INTO `user` VALUES ('16', 'safdasaswerewrw', '3242', '1');
INSERT INTO `user` VALUES ('17', 'erewrw', '3242', '1');

热点排行