hql 语句多表联合查询

yyorange 2012-02-20 05:36:33
现有需求如下:在数据库中有表一名为test1,属性有cid.cname,cpwd;表二名为test2,属性有did,dname,dpwd,并且两张表都在项目中又实体类映射,现在项目中有实体类映射test,属性为cid,cname,cpwd,did,dname,dpwd,我想写个hql语句,查询表test1与表test2,查询语句为:

String sql="select CName,DName from Test1 test1,Test2 test2 where test1.Cid=test2.Did";

怎么才能把返回的list属性为test呢?不是test1,也不是test2,而是test呢?而这个test在数据库中不存在,可以嘛?


public List<Test> getAll()
{
String sql="select CName,DName from Test1 test1,Test2 test2 where test1.Cid=test2.Did";

return (List<Test>)super.find(sql);
}

...全文
21946 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
catom_w 2014-04-17
  • 打赏
  • 举报
回复
dfsdfsdfsdf
yyorange 2012-07-05
  • 打赏
  • 举报
回复
对,自己建[Quote=引用 15 楼 的回复:]

请问一下,那个Test的类是要自己建吗?
[/Quote]
csc454105563 2012-05-23
  • 打赏
  • 举报
回复
请问一下,那个Test的类是要自己建吗?
xyz0101123132 2012-02-28
  • 打赏
  • 举报
回复
这分赚到累死了。
①你想用聚合函数那没有问题啊
hql写成 select sum(c.CSCcoe) from Test1 c,Test2 d where c.CId=d.DId,其他你看着办。这问题你为什么不看官方文档啊?
②12楼的问题,用13楼回答。
  • 打赏
  • 举报
回复
有重复名字的字段的话,查询的时候给表取别名吧
select b1.cid,b2.cid from table1 b1,table2 b2 where ....
yyorange 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gudong2945 的回复:]

Java code



import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import org.hibernate.Query;
import org.hibernate.Sessio……
[/Quote]


还有,朋友,我就是问问,假如我的这两张表中有相重复的字段,我应该怎么办?就是假如test1表中有Cid,test2中也有cid,那么我这个实体类是不是就不能这么写了,假如我想获得到这两个Id,我应该怎么做呢?麻烦您了,谢谢
c91s1h8 2012-02-24
  • 打赏
  • 举报
回复
不清楚帮你顶
yyorange 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gudong2945 的回复:]

Java code



import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import org.hibernate.Query;
import org.hibernate.Sessio……
[/Quote]


太感谢了,我就是大小写出现问题了,所以我的HQL语句总报错,谢谢你了,还有一个问题, String sql="select new y.model.Test(c.CId,c.CName,d.DId,d.DName) from Test1 c,Test2 d where c.CId=d.DId";可以查询cid,cname,did,dname,同理假如我现在在表test1中增加一字段为CScore,分数,我的sql语句应为:sql="select new y.model.Test(c.CId,c.CName,c.CSCcoe,d.DId,d.DName) from Test1 c,Test2 d where c.CId=d.DId"(相应的构造方法同时生成);现在我有另一需求,就是我想得到查询结果分数的总和,也就是说需要聚合函数sum。我这hql语句应该怎么写?同理,avg等其他聚合函数呢?麻烦了
yyorange 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gudong2945 的回复:]

1、将Test定义为一个Bean
2、提供默认构造函数和一个有参数的构造函数,这个有参数的构造函数的参数分别为cid,cname,cpwd,did,dname,dpwd
3、String sql="select new Test(cid,cname,cpwd,did,dname,dpwd
) from Test1 c,Test2 d where c.Cid=d.Did";

执行返回……
[/Quote]

您好,我用您的hql语句试了试,出错了,信息为:

Unable to locate class [Test] [select new Test(CId,CName,DId,DName) from y.model.Test1 c,y.model.Test2 d where c.CId=d.DId]

我的方法是:

public List<Test> getAll()
{
String sql="select new Test(CId,CName,DId,DName) from Test1 c,Test2 d where c.CId=d.DId";

return (List<Test>)super.find(sql);
}


另外我试了试用String sql="select new y.model.Test(CId,CName,DId,DName) from Test1 c,Test2 d where c.CId=d.DId";语句写,报的是空指针错误,请高手帮我解决一下吧,麻烦你了.

另附上,test,test1,test2,映射类:
Test:

package y.model;

import java.io.Serializable;
import java.util.Date;


/**
* 多表联合查询测试实体类
* @param classname
* @param info
* @param project
* @param classChineseName
*/

public class Test implements Serializable {


//无参数构造方法
public Test()
{
super();
}



//编号
private String CId;


public String getCId(){
return this.CId;
}

public void setCId(String CId){
this.CId=CId;
}
//姓名
private String CName;


public String getCName(){
return this.CName;
}

public void setCName(String CName){
this.CName=CName;
}
//编号
private String DId;


public String getDId(){
return this.DId;
}

public void setDId(String DId){
this.DId=DId;
}
//姓名
private String DName;


public String getDName(){
return this.DName;
}

public void setDName(String DName){
this.DName=DName;
}
//含参数构造方法
public Test(String cId,String cName,String dId,String dName)
{
super();
this.CId=cId;
this.CName=cName;
this.DId=dId;
this.DName=dName;
}
}

Test1:

package y.model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "test1")
public class Test1 implements Serializable {
@Id
@GenericGenerator(name = "generator", strategy = "uuid.hex")
@GeneratedValue(generator = "generator")

@Column(name = "C_Id")
private String CId;

@Column(name = "C_Name")
private String CName;

@Column(name = "C_Pwd")
private String CPwd;

@Column(name = "C_Sex")
private String CSex;

@Column(name = "C_Ago")
private String CAgo;

public String getCId(){
return this.CId;
}

public void setCId(String CId){
this.CId=CId;
}

public String getCName(){
return this.CName;
}

public void setCName(String CName){
this.CName=CName;
}

public String getCPwd(){
return this.CPwd;
}

public void setCPwd(String CPwd){
this.CPwd=CPwd;
}

public String getCSex(){
return this.CSex;
}

public void setCSex(String CSex){
this.CSex=CSex;
}

public String getCAgo(){
return this.CAgo;
}

public void setCAgo(String CAgo){
this.CAgo=CAgo;
}

}

Test2:

package y.model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "test2")
public class Test2 implements Serializable {
@Id
@GenericGenerator(name = "generator", strategy = "uuid.hex")
@GeneratedValue(generator = "generator")

@Column(name = "D_Id")
private String DId;

@Column(name = "D_Name")
private String DName;

@Column(name = "D_Pwd")
private String DPwd;

@Column(name = "D_Age")
private Integer DAge;

@Column(name = "D_Addr")
private String DAddr;

@Column(name = "D_Sex")
private String DSex;

public String getDId(){
return this.DId;
}

public void setDId(String DId){
this.DId=DId;
}

public String getDName(){
return this.DName;
}

public void setDName(String DName){
this.DName=DName;
}

public String getDPwd(){
return this.DPwd;
}

public void setDPwd(String DPwd){
this.DPwd=DPwd;
}

public Integer getDAge(){
return this.DAge;
}

public void setDAge(Integer DAge){
this.DAge=DAge;
}

public String getDAddr(){
return this.DAddr;
}

public void setDAddr(String DAddr){
this.DAddr=DAddr;
}

public String getDSex(){
return this.DSex;
}

public void setDSex(String DSex){
this.DSex=DSex;
}

}
xyz0101123132 2012-02-21
  • 打赏
  • 举报
回复
重点找到了吗?
String sql="select new Test(CId,CName,DId,DName) from Test1 c,Test2 d where c.CId=d.DId"

要加前缀啊! c.CId c.CName d.DId d.DName
xyz0101123132 2012-02-21
  • 打赏
  • 举报
回复



import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import y.model.Test;
import y.model.Test1;
import y.model.Test2;

import com.targ.track.financeManager.buildProjectAccount.domain.BuildProjectAccount;
import com.targ.track.financeManager.buildProjectAccount.domain.BuildProjectAccountDetail;
import com.targ.track.startAppManager.domain.StartApplication;



public class MyJunitTest {
@org.junit.Test
public void testDDL(){
//插入数据
HibernateTest.doInHibernateSession(new InHibernateSession(){
@Override
public Object doInHibernateSession(Session session) {
Test1 test1 = new Test1();
test1.setCAgo("CAgo");
test1.setCName("CName");
test1.setCPwd("CPwd");
test1.setCSex("CSex");
Test2 test2 = new Test2();
test2.setDAddr("DAddr");
test2.setDAge(123);
test2.setDName("DName");
test2.setDPwd("DPwd");
test2.setDSex("DSex");
session.save(test1);
session.save(test2);
return null;
}
});
//查询
List<Test> all = (List<Test>) HibernateTest.doInHibernateSession(new InHibernateSession(){
public Object doInHibernateSession(Session session) {
String sql="select new y.model.Test(c.CId,c.CName,d.DId,d.DName) from Test1 c,Test2 d where c.CId=d.DId";
Query query = session.createQuery(sql);
return query.list();
}
});
for(Test test : all){
System.out.println(test);
}

}
public static class HibernateTest {
public static Object doInHibernateSession(InHibernateSession doInHibernateSession){
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
try{
Object object = doInHibernateSession.doInHibernateSession(session);
transaction.commit();
return object;
}catch(RuntimeException e){
try{
System.err.println("rollback");
transaction.rollback();
}catch(RuntimeException ex){
System.err.println("回滚失败!");
}
throw e;
}finally{
//HibernateSessionFactory.closeSession();
}

}

}
public interface InHibernateSession {
public Object doInHibernateSession(Session session);
}

}

xyz0101123132 2012-02-21
  • 打赏
  • 举报
回复
你既然都把类写出来了,我就帮你做做吧。
飓风zj 2012-02-20
  • 打赏
  • 举报
回复
一般很少这么做
你可以直接写sql
hibernate支持sql语句的

是在不行 你可以几个表关联建立个视图,这个视图和你po进行映射,然后直接写hql就可以了
xyz0101123132 2012-02-20
  • 打赏
  • 举报
回复
1、将Test定义为一个Bean
2、提供默认构造函数和一个有参数的构造函数,这个有参数的构造函数的参数分别为cid,cname,cpwd,did,dname,dpwd
3、String sql="select new Test(cid,cname,cpwd,did,dname,dpwd
) from Test1 c,Test2 d where c.Cid=d.Did";

执行返回List<Test>
mady0505 2012-02-20
  • 打赏
  • 举报
回复
把test设置为一个Bean,然后循环设置和读取就可以了。当然,也可以不用Bean,直接从List中读取Object,然后转化成相应的值,看自己的需求了。
蛋黄车 2012-02-20
  • 打赏
  • 举报
回复
使用一个抽象的java类test,test中只有二个属性cname和dname。设置set/get方法

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧