查了一下hibernate的文档,发现了formula这个东东,以前没注意,现在发现可以用它来取数据字典里的东东。 就是在User里加一个areaName,在hbm配置User时对areaName做如下配置: <property name="areaName" formula="(select area_name from area a where a.area_id=areaId)"/>其中areaId是当前User的属性。 这样就不用加载整个area对象了。同时User也可以懒加载area。不知道这种做法效率如何
那User应该是public class User{
private String areaid;
....
}而应该是public class User{
private Area area;
....
}然后直接user.getArea().getAreaName()这样获取地区名称
那就在DAO类里进行查找传值吧
大概例如这样
User user = xxxxxxx //这里你获取到了User
String areaid = user.getAreaId();Area area = session.get(Area.class,areaid);然后再从area中获取地区字段~
2.我也不赞同3楼的写法(但是也是个方法在数据量没有达到这个优化等级时)
3.万一真到了数据量会因为多一查一个对象而发生效率问题,那就直接在user表里加个areaName也是行的
一楼的回答很好,这是多对一,地区为多,用户为一,一个地区可以对应多个用户,这样,你只要在User类中加入Area变量就行,至于一对多,多对一的配置,建议你去看一下这方面的资料,很多的。如果配置是懒加载,更不用担心这个性能问题,懒加载在查询时只会先查出来User,当你需要Area的时候才回去查询。Hibernate查询时,在Session不关闭的情况下,会自动取出area。如果每次查询都需要area的时候,你可以在配置上加入一个fetch条件,指定每次都去查询area。这样Hibernate会自动查询。如果是在做web开发,并且关注性能问题,你可以了解一下OpenSessionInView模式。
查到所有地区key 为id value 为name
你有id 在从map.get(id);拿出来
就是在User里加一个areaName,在hbm配置User时对areaName做如下配置:
<property name="areaName" formula="(select area_name from area a where a.area_id=areaId)"/>其中areaId是当前User的属性。
这样就不用加载整个area对象了。同时User也可以懒加载area。不知道这种做法效率如何
你的areaId 是动态传参过去的吗? 还是就是个列名?
http://onjava.com/pub/a/onjava/2005/08/03/hibernate.html?page=1 e文版
http://www.blogjava.net/rosen/archive/2005/09/19/13317.html 翻译后的文字
http://davidyao.iteye.com/blog/521635 我使用的是@Formula注解 配置的
http://solonote.iteye.com/blog/215093 貌似网上转载的都是这篇文章小demo:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;import org.hibernate.annotations.Formula;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "userTable")
public class User {
@GenericGenerator(name = "generator", strategy = "native")
@Id
@GeneratedValue(generator = "generator")
@Column(name="cn_id")
private int id;
@Column(name="cn_name")
private String name;
@Column(name="cr_teacher_id")
private int teacherId;
//formula里面的参数是必须要有 () 小括号的 里面的参数是sql语句、 而你要动态传参可以使用当前实体类的某个属性、比如下面teacherId 就是User类里面的属性、
@Formula("( select t.name from teacherTable as t where t.id = teacherId )")
private String teacherName;//这个字段在数据库中是不存在的
//setter getter 略
}