今天遇到个问题,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 显示了。
分享到:
相关推荐
HQL支持多种查询方式,包括单表查询、多表查询、连接查询等。其中,多表查询是处理复杂数据关系的关键技术,它允许开发者在一个查询语句中同时操作多个表,从而提高数据处理的效率和查询的灵活性。多表查询通常涉及...
在实际开发中,HQL关联查询的应用场景非常广泛,特别是在需要跨多个实体进行数据检索的情况下。例如,在电子商务系统中,我们需要获取用户信息及其相关的订单信息时,就可以利用HQL关联查询来简化这一过程。此外,当...
通常,此类会包含对Hibernate Session的操作,如打开Session,执行HQL查询,处理结果集,然后关闭Session。测试代码可能模拟了用户登录系统(SysUser),并尝试获取该用户所关联的所有数据,比如角色(Role)或者...
根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的...需要注意的是,在编写连表查询时要充分考虑性能问题,避免因查询复杂度过高而导致性能瓶颈。
Hibernate 支持多种方式来实现多表连接查询,包括 HQL(Hibernate Query Language)和 Criteria 查询。本项目主要关注 Criteria API 的使用,这是一种基于 Java 对象的查询方式,更加灵活且易于理解和维护。 **...
当需要查询多个属性时,可以在`SELECT`子句中列出多个属性,如: ```java List[]> results = session.createQuery("SELECT user.name, user.age FROM User user").list(); ``` 查询结果将以`Object[]`数组的形式...
HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接编写SQL语句的麻烦,并且支持跨数据库的移植性。 二、HQL模糊查询...
### HQL查询及语法详解 #### 一、HQL简介 HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。它基于SQL标准,但更加强调对象模型,支持Java中的对象关系映射(ORM),能够处理...
在这个示例中,我们首先定义了一个HQL查询字符串,该字符串指定了查询的类(Subject)以及模糊匹配的字段(subname 和 subinfo)。接着,我们通过`session.createQuery()`方法创建了一个`Query`对象,并使用`...
HQL查询 帮助文档
Hibernate 的 HQL 语言提供了强大的查询功能,使得我们可以方便地检索和操作数据,特别是在多对多关系的情况下。 知识点: 1. Hibernate 的 HQL 语言可以用来编写查询语句,以便检索和操作数据。 2. 在多对多关系...
HQL 中的多表查询使用 FROM 语句,例如:FROM eg.Cat as cat, eg.Dog as dog。多表查询可以使用 JOIN 语句来关联多个表。 3.JOIN 语句 HQL 中的 JOIN 语句用于关联多个表,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN...
- 在HQL查询语句的`WHERE`子句中使用子查询。 - 关键字`ALL`, `ANY`/`SOME`, `IN`, `EXISTS`等可以用于子查询。 - **HQL提供的集合操作函数**: - `size()`/`size`: 获取集合中元素的数目。 - `minIndex()`/`...
在某些情况下,需要同时查询多个实体的数据,并将这些数据组合在一起。例如,查询两个实体之间的关联关系时: ```hql SELECT NEW 类名(实体1属性1, 实体2属性2, ...) FROM 实体1, 实体2 WHERE 实体1.ID = 实体2.ID ...
hql查询多个实体类,类之间有外键关系,但是没有外键关联
以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...
这里的关键点在于使用`createQuery`方法创建了一个HQL查询对象,并通过`setString`方法设置参数值,最后通过`list`方法执行查询并获取结果列表。 #### 三、分页查询 分页查询在处理大量数据时非常有用,可以有效地...