——>最近在写一个项目的时候碰到了一个问题,其实说是“问题”,主要是我的水平太低了/羞涩一笑。
——>就是在进行查询的时候,我想要联合两个表进行查询,但是又不想像 sql 那种 rs.nex() 这种方式去获取和输出数据,而是想要将其封装成为对象,然后在前台通过调用方法进行读取对象的属性。
Let's begin!
那我就拿我的部分代码来举个例子吧!我的其中涉及到了两个表,分别是 公司表 和 公司资质表,然后在公司资质表中的一个列 company 对应公司表的主键。对应于文件时这样的:
Qualifications.java (公司资质对应实体类):
package com.test.beans; /** * Aptitude entity. @author MyEclipse Persistence Tools */ public class <strong>Qualifications</strong> implements java.io.Serializable { // Fields private String id; private String company; private String detail; private String image; // Constructors /** default constructor */ public Qualifications() { } /** full constructor */ public Qualifications(String id, String company, String detail, String image) { this.id = id; this.company = company; this.detail = detail; this.image = image; } // Set & Get ... }
Company.java (公司对应实体类):
package com.test.beans; import java.util.HashSet; import java.util.Set; /** * Corporation entity. @author MyEclipse Persistence Tools */ public class Company implements java.io.Serializable { // Fields //1 代表直接填充 2 代表需要二次编辑 private String id; //ID 生成器生成 ID 2 private String name; //前台自动填充 1 private String operationScope; //经营范围,前台直接填充 1 // Constructors /** default constructor */ public Company () { } /** full constructor */ public Company (String id, SumAccount sumAccount, String name, String operationScope) { this.id = id; this.sumAccount = sumAccount; this.name = name; this.operationScope = operationScope; } //Set & Get ... }
其中,company 只是一个存储的键,并非外键,所以,如果我们想要查找两个表该怎么做呢?
我们知道,Java 的核心是 多线程 和 面向对象 ,所以,我们就用面向对象的方法来解这道题吧~
How ?
我们首先建一个实体类,类中的属性使用你想要获取的属性,一一对应,但是命名可以不同,随个人习惯了,能分清楚就可以,比如,我这里就再建一个类。
QualificationsTemp.java (中间过度类,用于存储信息):
package com.test.beans; public class QualificationsTemp { private String image, company, detail; private String id, name, operationScope; public QualificationsTemp(String image, String company, String detail, String id, String name, String operationScope) { super(); this.image = image; this.company = company; this.detail = detail; this.id = id; this.name = name; this.operationScope = operationScope; } //Set & Get //这个需要写,因为我们通过对象获取其属性就是使用的 set 和 get 方法 ... }
其中构造方法是必须的,因为我们需要通过这个构造方法初始化对象,为其赋值。可以看出,我新建的这个类定义了和两个对应的实体类相对应的属性,然后就是在 action 中写 SQL 哦,不,是 HQL 语句了。
String hql = "select new com.<strong>test</strong>.beans.QualificationsTemp(ap.image,ap.company,ap.detail,cor.id, cor.name, cor.operationScope) from <strong>Company</strong> cor,<strong>Qualifications</strong> ap where cor.id = ap.company"; Query aptitudeChecking = session.createQuery(hql); //aptitudeChecking.setString(0, "1"); 这一行用于设置预编译的填充 类似于 Preparedstatement 中的‘?’占位符填充 List aptitudeCheckingList = (List)aptitudeChecking.list();
注意上边的 HQL 语句,其中需要写明你的类对应的具体类,以及其中的属性填充要和你构造方法中的一 一对应,这样,就会返回一个指定类型的数组了。