`
shukuiyan
  • 浏览: 413557 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 class="identity" />
        </id>
        <many-to-one name="course" class="com.yan.hibernate.Course" fetch="select">
            <column name="cno" />
        </many-to-one>
        <many-to-one name="student" class="com.yan.hibernate.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');
分享到:
评论

相关推荐

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地 SQL 查询等。 在 ...

    Hibernate 课件_HQL

    以上就是关于Hibernate中HQL查询的相关知识点的详细介绍。这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。

    hibernate3-hql.jar

    hibernate3-hql.jar .

    Hibernate框架]Hql语句in中带参数的写法

    Hibernate框架Hql语句in中带参数的写法 Hibernate框架中,在使用HQL语句时,需要传递参数,而在HQL语句中使用in关键字时,需要特别注意参数的传递方式。在本文中,我们将讨论如何在HQL语句中使用in关键字带参数的...

    weblogic12 下 org.hibernate.hql.ast.HqlToken

    通过以上步骤,可以有效地解决WebLogic 12环境中因Hibernate版本不兼容而导致的`org.hibernate.hql.ast.HqlToken`类冲突问题。这种方法不仅适用于WebLogic 12,对于其他版本的WebLogic服务器同样适用,关键在于正确...

    hibernate-HQL语句大全

    hibernate-HQL语句大全

    Hibernate数据检索(HQL)笔记

    `session.createQuery(hql)` 创建了一个 `Query` 对象,通过 `setParameter` 方法设置参数值,最后通过 `query.list()` 获取查询结果。 #### 三、HQL 查询优化 - **使用缓存**:为了提高性能,可以在应用程序中使用...

    Hibernate-HQL.rar_HQL_hibernate hql

    本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...

    hibernateHQL关联查询

    如果某条记录在另一个表中没有匹配,则不会显示这条记录。 2. **外连接(Outer Join)**: - **左外连接(Left Outer Join)**:除了返回两个表中满足连接条件的记录外,还会返回左表中不满足连接条件但右表中不...

    Hibernate hql查询语法总结

    这需要在`Student`类中提供一个对应的构造函数来接收这些属性。 5. 查询链接: HQL支持SQL的连接查询,包括内连接、左外连接、右外连接和全连接(不常用)。例如,使用内连接: ```java select a.id, b.id from A a...

    Hibernate注解方式、HQL查询

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细探讨Hibernate的注解方式以及HQL(Hibernate Query Language)查询...

    HQL是hibernate自己的一套查询

    在上面的示例中,我们首先通过`HibernateUtil.getSession()`方法获取到一个`Session`实例,然后定义了一个HQL查询语句,该语句用于从`Admin`表中查询`aname`为`name`的所有记录。最后通过`createQuery`方法创建查询...

    经典hibernate教程-HQL语句

    HQL的全称是? 和SQL相比,HQL有哪些特点? HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria...

    Hibernate_HQL.rar_hibernate HQL_hibernate hql src

    对hibernate的hql进行了详尽的讲解

    Hibernate实例开发 HQL 与 QBC 查询

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query ...

    Hibernate之HQL查询

    例如,假设我们有一个`Student`类,包含`name`和`age`属性,一个简单的HQL查询可能如下: ```sql SELECT s FROM Student s WHERE s.age &gt; 18 ``` 这个查询会返回所有年龄大于18岁的学生对象。 **2. HQL的SELECT...

    hibernate 中HQL语句查询学习笔记

    在本文档中所涉及的示例基于一个名为`joblog`的数据库,其中包含三个表:`student`(学生表)、`course`(课程表)和`sc`(选课表)。 - **学生表(student)**: - 字段包括:`id`(主键)、`sno`(学号)、`...

Global site tag (gtag.js) - Google Analytics