Hibernate自定义字段查询 注意事项
关于Hibernate自定义字段查询的方法,网上有很多,我这里就不详细写了,只把几个查询方法的注意事项说明一下。
废话少说, 进入正题:
假设有2个实体对象,Institution和User,结构与配置如下:
@Entity(value = "Institution")
@Table(name = ”TB_INSTITUTION")
public class Institution {
@Id
private int id;
private String institutionName;
}
@Entity(value="User")
@Table(name="TB_USER")
public class User{
@Id
private int id;
private String username;
@ManyToOne
@JoinColumn(name="institutionId")
private Institution institution;
public User(){
}
public User(int id,String username,String institutionName){
this.id = id;
this.username = username;
this.institution = new Institution();
this.institution.setInstitutionName(institutionName);
}
}
此处省略了一些配置和set,get方法。
下面查询User对象
第一种方法:
Criteria criteria = session.createCriteria(User.class,"user");
ProjectionList pList = Projections.projectionList();
criteria.setResultTransformer(Transformers.aliasToBean(User.class));
criteria.list();
第二种方法:
HQL查询
String hql = null;
hql = "SELECT new User(u.id,u.username,u.institution.institutionName) FROM User as u";
Query query = session.createQuery(hql);
query.list();
注意的地方是:
1、Criteria 查询需要提供相应字段的set和get方法,HQL需要提供相应的构造函数。
2、当User关联的外键 institutionId为null时,查询是必须使用Left join(
SELECT new User(u.id,u.username,ins.institutionName) FROM User as u LEFT JOIN u.institution as ins),
因为Hibernate默认是INNER JOIN,否则查询不出institutionId为null的记录.
3、编写的HQL语句中的各字段必须都有严格定义,例如:u.id,u.username而不是直接使用id,username。
另外: 也可以使用SQL语句查询自定义字段。
格式是:
SELECT new User(u.id,u.username,ins.institutionName) FROM TB_USER AS u LEFT JOIN TB_INSTITUTION AS ins ON ins.id = u.institutionId;
这种方法我没试过,有兴趣的朋友可以试试。
举一反三:
经测试:SELECT new User(u.id,u.username,new Institution(u.institution.institutionName)) FROM User as u
这种形式的语句是没办法通过的。Hibernate还没智能到可以在对象里面检测对象。
写的不对的地方,请指证;
欢迎大家评论,发表自己的意见。