`
wwwzhouhui
  • 浏览: 361094 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hql 多表查询的问题

阅读更多

今天遇到个问题,2张表关联查询,要显示出另一张表ID的中文名称。本来直接HIBERNATE 多刷新一次就可以带出来,需要要求直接写出来,没办法 改进代码

表结构 WCSC_CSC

create table WCSC_CSC
(
  COMPCODE  VARCHAR2(32) not null,
  CSC_ID    NUMBER not null,
  NAME      VARCHAR2(100) not null,
  LOGO_URL  VARCHAR2(200),
  CSS_STYLE VARCHAR2(64),
  WELCOME   VARCHAR2(200),
  OTHER1    VARCHAR2(100),
  OTHER2    VARCHAR2(100)
)

 表WCSC_QUEUE

create table WCSC_QUEUE
(
  CSC_ID       NUMBER not null,
  QUEUE_ID     NUMBER not null,
  QUEUE_NAME   VARCHAR2(100),
  QUEUE_LENGTH NUMBER default 0 not null,
  ACD_TYPE     CHAR(1) default 0 not null
)

  2张表的关系是,WCSC_CSC 一 对WCSC_QUEUE表的多   关联字段是 CSC_ID

需求是查询出 WCSC_QUEUE 所有字段已经和WCSC_CSC表关联的 NAME

SQL 可以这样写:

select a.*, b.name
  from WCSC_CSC b, WCSC_QUEUE a
 where a.csc_id = b.csc_id
   and b.compcode = '0071'

 2张表我是单项WCSC_QUEUE  多对WCSC_CSC 一关联

   WCSC_CSC 表

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.ideal.csc.manager.entity">
	<class
		name="Csc"
		table="WCSC_CSC"
	>
		<meta attribute="sync-DAO">false</meta>
		<cache usage="read-write"/>
		<id   name="id"   column="CSC_ID"   type="java.lang.Long">  
           <generator class="sequence">
        	<param name="sequence">SEQ_WCSC_CSC_ID</param>
      	</generator>
        </id>
		<property
			name="name"
			column="NAME"
			type="string"
			not-null="false"
			length="100"
		/>
		<property
			name="logurl"
			column="LOGO_URL"
			type="string"
			not-null="false"
			length="200"
		/>
		<property
			name="cssstyle"
			column="CSS_STYLE"
			type="string"
			not-null="false"
			length="64"
		/>
		<property
			name="welcome"
			column="WELCOME"
			type="string"
			not-null="false"
			length="200"
		/>
		<property
			name="other1"
			column="OTHER1"
			type="string"
			not-null="false"
			length="100"
		/>
		<property
			name="other2"
			column="OTHER2"
			type="string"
			not-null="false"
			length="100"
		/>
		<property
			name="compcode"
			column="COMPCODE"
			type="string"
			not-null="true"
			length="32"
		/>
	</class>	
</hibernate-mapping>

   WCSC_QUEUE  表

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.ideal.csc.manager.entity">
	<class
		name="Queue"
		table="WCSC_QUEUE"
	>
		<meta attribute="sync-DAO">false</meta>
		<cache usage="read-write"/>
		<id   name="id"   column="QUEUE_ID"   type="java.lang.Long">  
           <generator class="sequence">
        	<param name="sequence">SEQ_WCSC_QUEUE_ID</param>
      	</generator>
        </id>
		<property
			name="queueName"
			column="QUEUE_NAME"
			type="string"
			not-null="false"
			length="100"
		/>
		<property
			name="queueLength"
			column="QUEUE_LENGTH"
			type="java.lang.Long"
			not-null="true"
		/>
		<property
			name="acdType"
			column="ACD_TYPE"
			type="string"
			not-null="true"
			length="2"
		/>
		<many-to-one
			name="csc"
			column="CSC_ID"
			class="com.ideal.csc.manager.entity.Csc"
			not-null="true"
		>
		</many-to-one>
	</class>	
</hibernate-mapping>

     这里用了单向多对一

<many-to-one
			name="csc"
			column="CSC_ID"
			class="com.ideal.csc.manager.entity.Csc"
			not-null="true"
		>
		</many-to-one>

    查询出结果可以 可是赋值的时候 返回一个对象,Queue 但是结果时需要 Queue对象和 CSC 对象的NAME值

   想了一下在Queue 对象中在定义个NAME 字段是为了取SQL 值赋值到Queue 对象,这样 返回页面 就直接用Queue对象来取值了

   Queue.java

package com.ideal.csc.manager.entity;

import com.ideal.csc.manager.entity.base.BaseQueue;

/***********************************************************************   
 *   
 *   Queue.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Sep 29, 2009   3:06:35 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class Queue extends BaseQueue {
private static final long serialVersionUID = 1L;
	
	public Queue(){
		super();
	}
	
	public Queue(java.lang.Long id){
		super(id);
	}
	
	private java.lang.String acdType2;

	public java.lang.String getAcdType2() {
		 String type=getAcdType();
		 if(null!=type){
			 if("0".equals(type)){
				 acdType2="随机";
			 }
			 else if("1".equals(type)){
				 acdType2="最少时间";
			 }
			 else if("2".equals(type)){
				 acdType2="最少次数";
			 }
			 else {
				 acdType2="客服等级";
			 }
		 }
		return acdType2;
	}

	public void setAcdType2(java.lang.String acdType2) {
		this.acdType2 = acdType2;
	}
	
	private java.lang.String cscname;

	public java.lang.String getCscname() {
		return cscname;
	}

	public void setCscname(java.lang.String cscname) {
		this.cscname = cscname;
	}
}

     定义一个cscname  设置 get set 方法

   Queue类继承BaseQueue 类,其中BaseQueue类是表 WCSC_QUEUE 对应字段的get set 方法

 好了,最后写DAO 层方法

  hql

public Pagination getQueue(String compcode, int pageNo, int pageSize) {
		Finder f1 = Finder.create(" from Queue bean");
		f1.append(" inner join  bean.csc csc ");
		f1.append(" where csc.compcode=:compcode")
				.setParam("compcode", compcode);
		return find2(f1, pageNo, pageSize);
	}

  带分页的find2 代码

 

protected Pagination find2(Finder finder, int pageNo, int pageSize) {
		int totalCount = countQueryResult(finder);
		Pagination p = new Pagination(pageNo, pageSize, totalCount);
		if (totalCount < 1) {
			p.setList(new ArrayList());
			return p;
		}
		Query query = getSession().createQuery(finder.getOrigHql());
		finder.setParamsToQuery(query);
		query.setFirstResult(p.getFirstResult());
		query.setMaxResults(p.getPageSize());
		List<Queue> list2=new ArrayList<Queue>();
		Iterator iterator1 = query.list().iterator(); 
		while (iterator1.hasNext()) { 
			Object[] o = (Object[]) iterator1.next(); 
		    Queue queue = (Queue) o[0];
		    Csc csc = (Csc) o[1]; 
		    queue.setCscname(csc.getName());
			list2.add(queue);
		}
		p.setList(list2);
		return p;
	}

    说明

 

Query query = getSession().createQuery(finder.getOrigHql());

    执行查询语句

 

Iterator iterator1 = query.list().iterator(); 

     返回结果LIST 对2个对象进行组合成一个LIST queue 对象

     因为是2个对象关联 返回结果 会返回2个对象集合,我们需要把第2个对象的NAME 字段取出 赋值到第一个对象的

    cscname  字段中,于是有了下面代码

 

 Queue queue = (Queue) o[0];
		    Csc csc = (Csc) o[1]; 
		    queue.setCscname(csc.getName());

   最后将新的对象重新装袋LIST 中返回,这样新对象中就有NAME 字段值了

页面中我们就直接可以用queue.id ,queue.cscname ,queue.queueName  显示了。

分享到:
评论
1 楼 qiushily2030 2010-04-12  
WCSC_CSC 一 对WCSC_QUEUE表的多?
看字段  错了吧

相关推荐

    hql多表查询

    HQL支持多种查询方式,包括单表查询、多表查询、连接查询等。其中,多表查询是处理复杂数据关系的关键技术,它允许开发者在一个查询语句中同时操作多个表,从而提高数据处理的效率和查询的灵活性。多表查询通常涉及...

    hibernateHQL关联查询

    在实际开发中,HQL关联查询的应用场景非常广泛,特别是在需要跨多个实体进行数据检索的情况下。例如,在电子商务系统中,我们需要获取用户信息及其相关的订单信息时,就可以利用HQL关联查询来简化这一过程。此外,当...

    HQL多对多的查询语句分析

    通常,此类会包含对Hibernate Session的操作,如打开Session,执行HQL查询,处理结果集,然后关闭Session。测试代码可能模拟了用户登录系统(SysUser),并尝试获取该用户所关联的所有数据,比如角色(Role)或者...

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的...需要注意的是,在编写连表查询时要充分考虑性能问题,避免因查询复杂度过高而导致性能瓶颈。

    Hibernate 多表连接分页查询示范项目

    Hibernate 支持多种方式来实现多表连接查询,包括 HQL(Hibernate Query Language)和 Criteria 查询。本项目主要关注 Criteria API 的使用,这是一种基于 Java 对象的查询方式,更加灵活且易于理解和维护。 **...

    HQL查询pdf资料

    当需要查询多个属性时,可以在`SELECT`子句中列出多个属性,如: ```java List[]&gt; results = session.createQuery("SELECT user.name, user.age FROM User user").list(); ``` 查询结果将以`Object[]`数组的形式...

    hibernate的HQL的模糊查询

    HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接编写SQL语句的麻烦,并且支持跨数据库的移植性。 二、HQL模糊查询...

    HQL查询及语法

    ### HQL查询及语法详解 #### 一、HQL简介 HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。它基于SQL标准,但更加强调对象模型,支持Java中的对象关系映射(ORM),能够处理...

    hql模糊查询hql模糊查询

    在这个示例中,我们首先定义了一个HQL查询字符串,该字符串指定了查询的类(Subject)以及模糊匹配的字段(subname 和 subinfo)。接着,我们通过`session.createQuery()`方法创建了一个`Query`对象,并使用`...

    HQL查询.ppt

    HQL查询 帮助文档

    Hibernate-HQL语句多对多写法

    Hibernate 的 HQL 语言提供了强大的查询功能,使得我们可以方便地检索和操作数据,特别是在多对多关系的情况下。 知识点: 1. Hibernate 的 HQL 语言可以用来编写查询语句,以便检索和操作数据。 2. 在多对多关系...

    HQL查询语言基础知识

    HQL 中的多表查询使用 FROM 语句,例如:FROM eg.Cat as cat, eg.Dog as dog。多表查询可以使用 JOIN 语句来关联多个表。 3.JOIN 语句 HQL 中的 JOIN 语句用于关联多个表,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN...

    HQL连接查询和注解使用总结

    - 在HQL查询语句的`WHERE`子句中使用子查询。 - 关键字`ALL`, `ANY`/`SOME`, `IN`, `EXISTS`等可以用于子查询。 - **HQL提供的集合操作函数**: - `size()`/`size`: 获取集合中元素的数目。 - `minIndex()`/`...

    Hql多结果集

    在某些情况下,需要同时查询多个实体的数据,并将这些数据组合在一起。例如,查询两个实体之间的关联关系时: ```hql SELECT NEW 类名(实体1属性1, 实体2属性2, ...) FROM 实体1, 实体2 WHERE 实体1.ID = 实体2.ID ...

    hql查询多个实体类,类之间没有外键关联

    hql查询多个实体类,类之间有外键关系,但是没有外键关联

    hibernate hql各类查询范例

    以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...

    Hibernate HQL查询 分页查询 模糊查询.docx

    这里的关键点在于使用`createQuery`方法创建了一个HQL查询对象,并通过`setString`方法设置参数值,最后通过`list`方法执行查询并获取结果列表。 #### 三、分页查询 分页查询在处理大量数据时非常有用,可以有效地...

Global site tag (gtag.js) - Google Analytics