hibernate两表查询

我的表

CREATE TABLE p_order (
oid int(11) NOT NULL AUTO_INCREMENT,
oadd varchar(255) DEFAULT NULL,
otel varchar(255) DEFAULT NULL,
uname varchar(11) DEFAULT NULL,
PRIMARY KEY (oid)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

CREATE TABLE p_order_item (
oi_id int(11) NOT NULL AUTO_INCREMENT,
oi_oid int(11) NOT NULL,
oi_num int(11) NOT NULL,
bname varchar(255) DEFAULT NULL,
bprice int(10) DEFAULT NULL,
PRIMARY KEY (oi_id) USING BTREE,
KEY p_order_fk (oi_oid) USING BTREE,
CONSTRAINT p_order_fk FOREIGN KEY (oi_oid) REFERENCES p_order (oid)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

我的目录结构

在这里插入图片描述

可以忽略book

一、实体,entity

1、Order

package com.day.entity;

public class Order {

private Integer oid;
private String oadd;
private String otel;
private String uname;

public Integer getOid() {
	return oid;
}

public void setOid(Integer oid) {
	this.oid = oid;
}

public String getOadd() {
	return oadd;
}

public void setOadd(String oadd) {
	this.oadd = oadd;
}

public String getOtel() {
	return otel;
}

public void setOtel(String otel) {
	this.otel = otel;
}

public String getUname() {
	return uname;
}

public void setUname(String uname) {
	this.uname = uname;
}
public Order() {
	super();
	// TODO Auto-generated constructor stub
}

}

2、OrderItem
package com.day.entity;

public class OrderItem {
private Integer oiId;
private Integer oiOid;
private Integer oiBid;

private Integer oiNum;
private String bname;
private Integer bprice;

public String getBname() {
	return bname;
}


public void setBname(String bname) {
	this.bname = bname;
}


public Integer getBprice() {
	return bprice;
}


public void setBprice(Integer bprice) {
	this.bprice = bprice;
}





public Integer getOiId() {
	return oiId;
}


public void setOiId(Integer oiId) {
	this.oiId = oiId;
}


public Integer getOiOid() {
	return oiOid;
}


public void setOiOid(Integer oiOid) {
	this.oiOid = oiOid;
}


public Integer getOiBid() {
	return oiBid;
}


public void setOiBid(Integer oiBid) {
	this.oiBid = oiBid;
}


public Integer getOiNum() {
	return oiNum;
}


public void setOiNum(Integer oiNum) {
	this.oiNum = oiNum;
}


public OrderItem() {
	// TODO Auto-generated constructor stub
}

}

3、Base 用来做连表的 这个比较关键!!!
package com.day.entity;

import java.io.Serializable;

public class Base implements Serializable{

@Override
public String toString() {
	return "Base [bname=" + bname + ", price=" + price + ", uname=" + uname + ", tel=" + tel + ", Address="
			+ Address + ", num=" + num + "]";
}


private String bname;
private Integer price;
private String uname;
private String tel;
private String Address;

private Integer num;





public Base(String bname, Integer price, String uname, String tel, String address, Integer num) {
	super();
	this.bname = bname;
	this.price = price;
	this.uname = uname;
	this.tel = tel;
	Address = address;
	this.num = num;
}


public String getBname() {
	return bname;
}


public void setBname(String bname) {
	this.bname = bname;
}


public String getUname() {
	return uname;
}


public void setUname(String uname) {
	this.uname = uname;
}


public String getAddress() {
	return Address;
}


public void setAddress(String address) {
	Address = address;
}


public String getTel() {
	return tel;
}


public void setTel(String tel) {
	this.tel = tel;
}


public Integer getNum() {
	return num;
}


public void setNum(Integer num) {
	this.num = num;
}


public Integer getPrice() {
	return price;
}


public void setPrice(Integer price) {
	this.price = price;
}


public Base() {
	// TODO Auto-generated constructor stub
}

}

二、 resources 中的mapper

1、Order.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
	<class  name="com.day.entity.Order" table="p_order">
	
		<id name="oid" type="java.lang.Integer">
			<column name="oid"></column>
			<generator class="native"></generator>
		</id>
		<property name="oadd" type="java.lang.String">
			<column name="oadd"></column>
		</property>
		<property name="otel" type="java.lang.String">
			<column name="otel"></column>
		</property>
		<property name="uname" type="java.lang.String">
			<column name="uname"></column>
		</property>
		
	</class>
</hibernate-mapping>

2、OrderItem.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
	<class  name="com.day.entity.OrderItem" table="p_order_item">
	
		<id name="oiId" type="java.lang.Integer">
			<column name="oi_id"></column>
			<generator class="native"></generator>
		</id>
		<property name="oiOid" type="java.lang.Integer">
			<column name="oi_oid"></column>
		</property>
		<property name="oiNum" type="java.lang.Integer">
			<column name="oi_num"></column>
		</property>
		<property name="bname" type="java.lang.String">
			<column name="bname"></column>
		</property>
		<property name="bprice" type="java.lang.Integer">
			<column name="bprice"></column>
		</property>
		
		
	</class>
</hibernate-mapping>

三、Dao

1、接口层
package com.day.dao;

import java.util.List;

import com.day.entity.Base;
import com.day.entity.Order;
import com.day.util.PageBean;

public interface IOrderDao {

public void add(Order order);

public List<Base> list(PageBean pb);

}

**2、实现层 我认为这里的代码是关键 好好领会 **
package com.day.dao.imp;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.day.dao.IOrderDao;
import com.day.entity.Base;
import com.day.entity.Order;
import com.day.util.PageBean;

import javafx.util.Callback;

public class OrderDaoImp extends HibernateDaoSupport implements IOrderDao {

public OrderDaoImp() {
	// TODO Auto-generated constructor stub
}

public void add(Order order) {
	this.getHibernateTemplate().save(order);
	
}

@SuppressWarnings("all")
public List<Base> list(final PageBean pb) {
	return this.getHibernateTemplate().execute(new HibernateCallback() {

		public Object doInHibernate(Session session) throws HibernateException {
			String hql="select oi.bname,oi.bprice,o.uname,o.otel,o.oadd,oi.oiNum from Order o,OrderItem oi where o.oid=oi.oiOid";//1、不能用* 2、必须用对象的匿名去点属性 否者会报错
			
			String countHql="select count(*) from Order o,OrderItem oi where o.oid=oi.oiOid";
			Query query=null;
			/*此步骤可省略,这个我用来分页的
			if(pb!=null&&pb.isPagination()) {
				query=session.createQuery(countHql);
				Object total=query.uniqueResult();//当返回的实例只有一个或者为null时
				pb.setTotal(total.toString());
			}*/
			query=session.createQuery(hql);
			/*此步骤可省略,这个我用来分页的
			if(pb!=null&&pb.isPagination()) {
				query.setFirstResult(pb.getStartIndex());
				query.setMaxResults(pb.getRows());
			}*/
			List list=query.list();//得到对象集合,普通的查询是hibernate利用实体映射自动将将结果集赋值
			
			List<Base> blist=new ArrayList<Base>();//利用地三者的实容器来装想要的属性,然后再返回
			Base b=null;
			for (int i = 0; i < list.size(); i++) {
				Object[] object=(Object[]) list.get(i);
				//一定要和hql语句的类型相匹配
				b = new Base((String) object[0], (Integer) object[1],(String) object[2],(String) object[3],(String) object[4],(Integer) object[5]);
				blist.add(b);
			}
			
			return blist;
		} 
	});
}

}

这些差不多就是我的代码了 至于其他层的代码就不多解释了,不懂的小伙伴可以来问我,觉得有建议的我更加期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 是一个开源的 Java 持久化框架,它可以简化数据库访问和操作。在 Hibernate 中,可以通过使用对象关系映射(ORM)的方式进行数据库查询,包括连表查询。 在 Hibernate 中,连表查询可以通过使用关联关系进行实现。Hibernate 提供了多种类型的关联关系,如一对一、一对多、多对一和多对多。这些关联关系可以在实体类之间建立映射关系,从而实现连表查询。 下面是一个示例,演示如何使用 Hibernate 进行连表查询: 假设有两个实体类:Order(订单)和Product(产品),它们之间存在多对一的关联关系。 ```java @Entity @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "product_id") private Product product; // 其他属性和方法 } @Entity @Table(name = "products") public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 其他属性和方法 } ``` 在上述示例中,Order 类中使用了 @ManyToOne 注解来建立与 Product 类的多对一关联关系。通过 @JoinColumn 注解指定了外键列的名称。 要进行连表查询,可以使用 Hibernate 的 Criteria 查询或 HQL(Hibernate Query Language)进行查询操作。以下是使用 Criteria 查询的示例代码: ```java Session session = sessionFactory.openSession(); CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Order> query = builder.createQuery(Order.class); Root<Order> root = query.from(Order.class); root.fetch("product", JoinType.INNER); query.select(root) .where(builder.equal(root.get("id"), orderId)); List<Order> orders = session.createQuery(query).getResultList(); ``` 上述示例中,通过 CriteriaQuery 的 fetch 方法来实现连表查询。在 fetch 方法中指定了需要关联查询的属性(这里是 "product"),并指定了关联类型(这里是 INNER)。 以上是一个简单的 Hibernate 连表查询示例,实际应用中,根据具体的业务需求和数据模型,连表查询的方式可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值