- 浏览: 217095 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
路温舒:
后台数据有变化的时候是怎么自动推送到前台的?
DWR推送技术运用 -
wzwahl36:
Json在线转Javabean工具 http://www.at ...
发现了google的gson,javabean与JSON转换 -
wzwahl36:
Json在线转Javabean工具 http://www.at ...
发现了google的gson,javabean与JSON转换 -
xiaolang078:
我的qq邮箱:374958285@qq.com ...
DWR推送技术运用 -
mly799280326:
不错,问题解决,谢谢
对于spring security3中自定义securityMetadataSource时,无法注入要使用的dao问题解决方案
因为一个报表需要的统计需要连接3张表,而且sql语句比较复杂,并且三张表都是百万数量级的数据。所有开始我
选择的是native SQL的方式去执行这个查询。但是问题来了,因为我们公司的框架JSP页面的展现是使用EC控件,而且
封装的方法在这里不能使用原生sql的方式,所有我只能选择建立视图。
建立视图后,使用Eclipse去映射这个视图,我在想,视图没有主键。而且自动生成的配置文件和相关的POJO类
发生了变化:
生成的POJO类有两个,一个跟表名对应的POJO类只有一个属性,就是一个 为 ID 的属性名 , 而且只有这一
个属性。 数据库表名Test ,POJO类Test.java代码如下:
public class Test implements java.io.Serializable {
private TestId id;
public Test() {
}
public Test(TestId id) {
this.id = id;
}
public TestId getId() {
return this.id;
}
public void setId(TestId id) {
this.id = id;
}
}
还一个pojo类是:TestId.java
这个类却包含了视图的所有字段映射:
public class TaizhangTestId implements java.io.Serializable {
// Fields
private String tname;
private String dname;
private String dtype;
private String plevel;
private String xinghao;
private String leavefactorysn;
private String dfactory;
private Date madedate;
private Date leavefactorydate;
private String remarks;
private Long did;
private Long pid;
}而且这个类重写了 hashcode()方法和equals()方法
配置文件如下: test.hbm.xml只有一个
<hibernate-mapping>
<class name="com.mytest.biz.mynext.pojo.Test" table="TEST" >
<composite-id name="id" class="com.mytest.biz.mynext.pojo.hbm.TestId">
<key-property name="pname" type="java.lang.String">
<column name="PNAME" length="200" />
</key-property>
<key-property name="dname" type="java.lang.String">
<column name="DNAME" length="200" />
</key-property>
<key-property name="dtype" type="java.lang.String">
<column name="DTYPE" length="200" />
</key-property>
<key-property name="plevel" type="java.lang.String">
<column name="PLEVEL" length="10" />
</key-property>
<key-property name="xinghao" type="java.lang.String">
<column name="XINGHAO" length="100" />
</key-property>
<key-property name="leavefactorysn" type="java.lang.String">
<column name="LEAVEFACTORYSN" length="100" />
</key-property>
<key-property name="dfactory" type="java.lang.String">
<column name="DFACTORY" length="100" />
</key-property>
<key-property name="madedate" type="java.util.Date">
<column name="MADEDATE" length="7" />
</key-property>
<key-property name="leavefactorydate" type="java.util.Date">
<column name="LEAVEFACTORYDATE" length="7" />
</key-property>
<key-property name="remarks" type="java.lang.String">
<column name="REMARKS" length="1024" />
</key-property>
<key-property name="did" type="java.lang.Long">
<column name="DID" precision="22" scale="0" />
</key-property>
<key-property name="pid" type="java.lang.Long">
<column name="PID" precision="22" scale="0" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
由于框架的限制,我在JSP页面不能使用<c:out property="pojo属性名"/>的方式去展现结果集。因为你的action
中查询的对象是Test,而你需要的属性名全在TestId中。
没有办法,我只能尝试着去修改配置文件,这个是重点:
<hibernate-mapping>
<class name="class name="com.mytest.biz.mynext.pojo.TestId" table="TEST">
<id name="did" type="java.lang.Long"> //我把did强行指定为主键,而且把标签<key-property改成<property ,而且去除了 原配置文件<composite-id 指定主键的方式
<column name="did" precision="22" scale="0" />
<generator class="native" />
</id>
<property name="pname" type="java.lang.String">
<column name="PNAME" length="200" />
</property>
<property name="dname" type="java.lang.String">
<column name="DNAME" length="200" />
</property>
<property name="dtype" type="java.lang.String">
<column name="DTYPE" length="200" />
</property>
<property name="plevel" type="java.lang.String">
<column name="PLEVEL" length="10" />
</property>
<property name="xinghao" type="java.lang.String">
<column name="XINGHAO" length="100" />
</property>
<property name="leavefactorysn" type="java.lang.String">
<column name="LEAVEFACTORYSN" length="100" />
</property>
<property name="dfactory" type="java.lang.String">
<column name="DFACTORY" length="100" />
</property>
<property name="madedate" type="java.util.Date">
<column name="MADEDATE" length="7" />
</property>
<property name="leavefactorydate" type="java.util.Date">
<column name="LEAVEFACTORYDATE" length="7" />
</property>
<property name="remarks" type="java.lang.String">
<column name="REMARKS" length="1024" />
</property>
<property name="pid" type="java.lang.Long">
<column name="PID" precision="22" scale="0" />
</property>
</class>
</hibernate-mapping>
结果居然成功执行数据库查询
----------------------------------------------------------------------
第二种 方法
Hibernate对视图的操作
Hibernate对视图进行操作时和对普通的表有些不同,下面就是一个Hibernate操作视图的例子:
视图:
SELECT a.SPID, a.SPKey, b.serviceID, b.serviceName, c.serviceItemID, c.itemName
FROM dbo.tbSPInfo a
INNER JOIN dbo.tbService b ON a.SPID = b.SPID LEFT OUTER JOIN
dbo.tbServiceItem c ON b.serviceID = c.serviceID
1.首先根据视图中的字段定义一个bean
package com.txsec.lc.is.bean;
import java.io.Serializable;
public class ServiceId implements Serializable {
private static final long serialVersionUID = - 2298938310945830572L ;
private String spId;
private String spKey;
private String serviceId;
private String serviceName;
private String serviceItemId;
private String itemName;
public ServiceId() ... {
super ();
}
public String getItemName() ... {
return itemName;
}
public void setItemName(String itemName) ... {
this .itemName = itemName;
}
public String getServiceId() ... {
return serviceId;
}
public void setServiceId(String serviceId) ... {
this .serviceId = serviceId;
}
public String getServiceItemId() ... {
return serviceItemId;
}
public void setServiceItemId(String serviceItemId) ... {
this .serviceItemId = serviceItemId;
}
public String getServiceName() ... {
return serviceName;
}
public void setServiceName(String serviceName) ... {
this .serviceName = serviceName;
}
public String getSpId() ... {
return spId;
}
public void setSpId(String spId) ... {
this .spId = spId;
}
public String getSpKey() ... {
return spKey;
}
public void setSpKey(String spKey) ... {
this .spKey = spKey;
}
}
...
2.定义一个bean,用组合方式将ServiceId包含进去
package com.txsec.lc.is.bean;
import java.io.Serializable;
public class ServiceView implements Serializable {
private static final long serialVersionUID = - 2909733442648785569L ;
private ServiceId id;
public ServiceView() ... {
super ();
}
public ServiceId getId() ... {
return id;
}
public void setId(ServiceId id) ... {
this .id = id;
}
}
...
3.映射文件
<? 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" >
< hibernate-mapping >
< class name ="com.txsec.lc.is.bean.ServiceView" table ="vwSPService" >
< composite-id name ="id" class ="com.txsec.lc.is.bean.ServiceId" >
< key-property name ="spId" type ="string" >
< column name ="SPID" />
</ key-property >
< key-property name ="spKey" type ="string" >
< column name ="SPKey" />
</ key-property >
< key-property name ="serviceId" type ="string" >
< column name ="serviceID" />
</ key-property >
< key-property name ="serviceName" type ="string" >
< column name ="serviceName" />
</ key-property >
< key-property name ="serviceItemId" type ="string" >
< column name ="serviceItemID" />
</ key-property >
< key-property name ="itemName" type ="string" >
< column name ="itemName" />
</ key-property >
</ composite-id >
</ class >
</ hibernate-mapping >
ok,用HQL进行查询时,就可以这样:
session.createQuery("from ServiceView sv where sv.id.serviceId = '100001'").list();
查询返回的是ServiceView对象或集合,要得到视图中字段的值,只需要调用ServiceView对象的getId()方法即可获得ServiceId对象,通过ServiceId对象的getXXX()方法,就可以访问到视图中的字段了。
选择的是native SQL的方式去执行这个查询。但是问题来了,因为我们公司的框架JSP页面的展现是使用EC控件,而且
封装的方法在这里不能使用原生sql的方式,所有我只能选择建立视图。
建立视图后,使用Eclipse去映射这个视图,我在想,视图没有主键。而且自动生成的配置文件和相关的POJO类
发生了变化:
生成的POJO类有两个,一个跟表名对应的POJO类只有一个属性,就是一个 为 ID 的属性名 , 而且只有这一
个属性。 数据库表名Test ,POJO类Test.java代码如下:
public class Test implements java.io.Serializable {
private TestId id;
public Test() {
}
public Test(TestId id) {
this.id = id;
}
public TestId getId() {
return this.id;
}
public void setId(TestId id) {
this.id = id;
}
}
还一个pojo类是:TestId.java
这个类却包含了视图的所有字段映射:
public class TaizhangTestId implements java.io.Serializable {
// Fields
private String tname;
private String dname;
private String dtype;
private String plevel;
private String xinghao;
private String leavefactorysn;
private String dfactory;
private Date madedate;
private Date leavefactorydate;
private String remarks;
private Long did;
private Long pid;
}而且这个类重写了 hashcode()方法和equals()方法
配置文件如下: test.hbm.xml只有一个
<hibernate-mapping>
<class name="com.mytest.biz.mynext.pojo.Test" table="TEST" >
<composite-id name="id" class="com.mytest.biz.mynext.pojo.hbm.TestId">
<key-property name="pname" type="java.lang.String">
<column name="PNAME" length="200" />
</key-property>
<key-property name="dname" type="java.lang.String">
<column name="DNAME" length="200" />
</key-property>
<key-property name="dtype" type="java.lang.String">
<column name="DTYPE" length="200" />
</key-property>
<key-property name="plevel" type="java.lang.String">
<column name="PLEVEL" length="10" />
</key-property>
<key-property name="xinghao" type="java.lang.String">
<column name="XINGHAO" length="100" />
</key-property>
<key-property name="leavefactorysn" type="java.lang.String">
<column name="LEAVEFACTORYSN" length="100" />
</key-property>
<key-property name="dfactory" type="java.lang.String">
<column name="DFACTORY" length="100" />
</key-property>
<key-property name="madedate" type="java.util.Date">
<column name="MADEDATE" length="7" />
</key-property>
<key-property name="leavefactorydate" type="java.util.Date">
<column name="LEAVEFACTORYDATE" length="7" />
</key-property>
<key-property name="remarks" type="java.lang.String">
<column name="REMARKS" length="1024" />
</key-property>
<key-property name="did" type="java.lang.Long">
<column name="DID" precision="22" scale="0" />
</key-property>
<key-property name="pid" type="java.lang.Long">
<column name="PID" precision="22" scale="0" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
由于框架的限制,我在JSP页面不能使用<c:out property="pojo属性名"/>的方式去展现结果集。因为你的action
中查询的对象是Test,而你需要的属性名全在TestId中。
没有办法,我只能尝试着去修改配置文件,这个是重点:
<hibernate-mapping>
<class name="class name="com.mytest.biz.mynext.pojo.TestId" table="TEST">
<id name="did" type="java.lang.Long"> //我把did强行指定为主键,而且把标签<key-property改成<property ,而且去除了 原配置文件<composite-id 指定主键的方式
<column name="did" precision="22" scale="0" />
<generator class="native" />
</id>
<property name="pname" type="java.lang.String">
<column name="PNAME" length="200" />
</property>
<property name="dname" type="java.lang.String">
<column name="DNAME" length="200" />
</property>
<property name="dtype" type="java.lang.String">
<column name="DTYPE" length="200" />
</property>
<property name="plevel" type="java.lang.String">
<column name="PLEVEL" length="10" />
</property>
<property name="xinghao" type="java.lang.String">
<column name="XINGHAO" length="100" />
</property>
<property name="leavefactorysn" type="java.lang.String">
<column name="LEAVEFACTORYSN" length="100" />
</property>
<property name="dfactory" type="java.lang.String">
<column name="DFACTORY" length="100" />
</property>
<property name="madedate" type="java.util.Date">
<column name="MADEDATE" length="7" />
</property>
<property name="leavefactorydate" type="java.util.Date">
<column name="LEAVEFACTORYDATE" length="7" />
</property>
<property name="remarks" type="java.lang.String">
<column name="REMARKS" length="1024" />
</property>
<property name="pid" type="java.lang.Long">
<column name="PID" precision="22" scale="0" />
</property>
</class>
</hibernate-mapping>
结果居然成功执行数据库查询
----------------------------------------------------------------------
第二种 方法
Hibernate对视图的操作
Hibernate对视图进行操作时和对普通的表有些不同,下面就是一个Hibernate操作视图的例子:
视图:
SELECT a.SPID, a.SPKey, b.serviceID, b.serviceName, c.serviceItemID, c.itemName
FROM dbo.tbSPInfo a
INNER JOIN dbo.tbService b ON a.SPID = b.SPID LEFT OUTER JOIN
dbo.tbServiceItem c ON b.serviceID = c.serviceID
1.首先根据视图中的字段定义一个bean
package com.txsec.lc.is.bean;
import java.io.Serializable;
public class ServiceId implements Serializable {
private static final long serialVersionUID = - 2298938310945830572L ;
private String spId;
private String spKey;
private String serviceId;
private String serviceName;
private String serviceItemId;
private String itemName;
public ServiceId() ... {
super ();
}
public String getItemName() ... {
return itemName;
}
public void setItemName(String itemName) ... {
this .itemName = itemName;
}
public String getServiceId() ... {
return serviceId;
}
public void setServiceId(String serviceId) ... {
this .serviceId = serviceId;
}
public String getServiceItemId() ... {
return serviceItemId;
}
public void setServiceItemId(String serviceItemId) ... {
this .serviceItemId = serviceItemId;
}
public String getServiceName() ... {
return serviceName;
}
public void setServiceName(String serviceName) ... {
this .serviceName = serviceName;
}
public String getSpId() ... {
return spId;
}
public void setSpId(String spId) ... {
this .spId = spId;
}
public String getSpKey() ... {
return spKey;
}
public void setSpKey(String spKey) ... {
this .spKey = spKey;
}
}
...
2.定义一个bean,用组合方式将ServiceId包含进去
package com.txsec.lc.is.bean;
import java.io.Serializable;
public class ServiceView implements Serializable {
private static final long serialVersionUID = - 2909733442648785569L ;
private ServiceId id;
public ServiceView() ... {
super ();
}
public ServiceId getId() ... {
return id;
}
public void setId(ServiceId id) ... {
this .id = id;
}
}
...
3.映射文件
<? 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" >
< hibernate-mapping >
< class name ="com.txsec.lc.is.bean.ServiceView" table ="vwSPService" >
< composite-id name ="id" class ="com.txsec.lc.is.bean.ServiceId" >
< key-property name ="spId" type ="string" >
< column name ="SPID" />
</ key-property >
< key-property name ="spKey" type ="string" >
< column name ="SPKey" />
</ key-property >
< key-property name ="serviceId" type ="string" >
< column name ="serviceID" />
</ key-property >
< key-property name ="serviceName" type ="string" >
< column name ="serviceName" />
</ key-property >
< key-property name ="serviceItemId" type ="string" >
< column name ="serviceItemID" />
</ key-property >
< key-property name ="itemName" type ="string" >
< column name ="itemName" />
</ key-property >
</ composite-id >
</ class >
</ hibernate-mapping >
ok,用HQL进行查询时,就可以这样:
session.createQuery("from ServiceView sv where sv.id.serviceId = '100001'").list();
查询返回的是ServiceView对象或集合,要得到视图中字段的值,只需要调用ServiceView对象的getId()方法即可获得ServiceId对象,通过ServiceId对象的getXXX()方法,就可以访问到视图中的字段了。
发表评论
-
hibernate SQLQuery addEntity
2012-10-14 12:36 0两个表(实体), 1对多双向关联: 班级: Clazz ( ... -
hibernate处理oracle 大字符数据CLOB
2011-03-17 22:25 1811项目中遇到要对Oralce数据库的CLOB字段进行处理的问题, ... -
Hibernate查询语言(Query Language), 即HQL
2010-10-24 16:17 3912Hibernate装备了一种极为有力的查询语言,(有意地)看上 ... -
Hibernate使用sql语句查询
2010-10-24 16:14 1446import java.util.Iterator; impo ... -
Hibernate查询语句--HQL
2010-10-22 11:53 1087Hibernate查询语句--HQL ... -
Hibernate连接池的配置
2010-08-12 00:49 11711:连接池的必知概念 ... -
hibernate以下三种连接池
2010-08-12 00:47 1066是以连接MySQl为例。 <!-- JDBC驱动程序 ... -
hibernate 连接查询
2010-08-12 00:43 9557三、连接查询 HQL和QBC支持的各种连接类型 在程序中指 ... -
Oracle 存储过程实现不确定行列转置,不确定列就平均值
2010-08-11 22:16 1819create or replace procedure QSi ... -
Hibernate 使用内连接(hql) 使用左外连接 命名的hql 命名的sql 调用存储过程Oracle 等
2010-08-11 21:42 7159使用内连接(hql) from Product p inner ...
相关推荐
总结起来,在J2EE项目开发中,使用Hibernate映射视图是一种解决复杂查询和跨表统计的有效策略。当原生SQL不适用时,创建视图并进行相应的ORM配置可以保持代码的整洁性和可维护性。需要注意的是,视图的映射可能会...
"自动生成 Hibernate 映射文件和实体类" 自动生成 Hibernate 映射文件和实体类是使用 MyEclipse 工具来实现的,这可以大大提高开发效率,减少开发时间。下面将详细介绍如何使用 MyEclipse 自动生成 Hibernate 映射...
开发者可以通过这个视图连接到各种数据库,查看、创建、修改表等,同时,它也是生成Hibernate映射文件的关键工具。 3. **生成Hibernate映射文件的步骤**: - 首先,需要在MyEclipse中创建一个新的Web项目,例如`...
3. **逆向工程(Hibernate Reverse Engineering)**:选中要映射的数据库表,右键选择`Hibernate Reverse Engineering`,这是MyEclipse提供的将数据库表转换为Hibernate映射文件和实体类的工具。 4. **配置生成选项...
Hibernate 注解映射 Hibernate 注解映射是 Hibernate 框架中的一种映射方式,它使用 Java 注解来描述实体类和数据库表之间的映射关系,提高开发效率。 一、 环境搭建和基本映射 在使用 Hibernate 注解映射之前,...
在Hibernate中,我们可以利用Hibernate的映射机制来处理视图,将其作为实体进行操作。 **视图的作用** 1. **数据安全**:视图可以限制用户对原始表的访问权限,只允许他们看到和修改特定的数据集。 2. **数据聚合**...
### MyEclipse自动生成Hibernate映射文件 #### 一、概述 在开发基于Java的Web应用时,ORM(对象关系映射)框架如Hibernate能够极大地提高数据持久化的效率及便捷性。MyEclipse是一款功能强大的集成开发环境,支持...
下面我们将详细介绍如何在MyEclipse中自动生成Hibernate映射文件。 首先,我们需要建立数据库连接。在MyEclipse中,可以通过`Window`菜单打开`MyEclipse Database Explorer`视图。在这里,你可以创建新的数据库连接...
在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...
5. **配置Hibernate映射文件**:虽然在JPA中可以直接使用注解进行配置,但在一些情况下,你可能还需要为每个实体创建对应的Hibernate XML映射文件,以进一步自定义映射细节。 6. **数据操作**:在实际应用中,你...
3. **动态映射**:动态映射是Hibernate的一种映射方式,它允许在运行时根据数据库表结构自动创建实体类的映射。这意味着,如果你的数据库表中包含CLOB列,Hibernate会自动识别并处理。 4. **处理CLOB的策略**: - ...
Hibernate 提供了多种映射方式,包括表、视图、存储过程等。 7. Hibernate O/R 映射 Hibernate O/R 映射是将 JavaBean 对象的属性与数据库表的字段相对应的过程。 Hibernate 提供了多种 O/R 映射方式,包括一对一...
在IT行业中,SpringMVC和Hibernate是两个非常重要的框架,它们分别是用于构建Web应用程序和对象关系映射(ORM)的工具。在这个“springmvc+hibernate多表映射”的主题中,我们将深入探讨如何在SpringMVC项目中集成...
3. **创建 Hibernate 映射文件**:通过插件可以直接在 Eclipse 中生成或编辑 Hibernate 映射文件。 4. **创建 Hibernate 配置文件**:提供向导来辅助创建 Hibernate 的配置文件,包括设置数据库连接信息等。 5. **...
Hibernate Synchronizer 是一款针对 Eclipse 开发环境的插件,旨在简化 Hibernate 映射文件的编辑与管理过程。通过提供专业的编辑器和一系列实用功能,如代码自动生成、智能完成功能、图形化大纲视图等,该插件显著...
- 在数据库视图中,右键点击你想映射的表,选择"Hibernate Reverse Engineering"。 - MyEclipse会自动生成对应表的Java实体类和`hbm.xml`映射文件,这些文件位于你之前创建的包内。 6. 配置映射: - 在`...
- 手动创建Java实体类(User),并为其添加Hibernate注解,例如`@Entity`等,以便于MyEclipse自动生成Hibernate映射文件。 ```java @Entity public class User { private int uid; private String pwd; private...
Hibernate是一个对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。通过Hibernate,开发者可以将数据库操作与业务逻辑分离,提高代码的可维护性和可复用性。 Spring与...
- **创建Hibernate映射文件**:这部分详细介绍了如何使用Eclipse插件来创建和管理Hibernate映射文件,这是将Java对象与数据库表关联起来的核心文件。 - **创建Hibernate配置文件**:解释了如何创建和配置Hibernate...