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 criteria = session.createCriteria(User.class,"user");

criteria.createCriteria("institution","institution");
 

ProjectionList pList = Projections.projectionList();

pList.add(Projections.property("user.id").as("id"))
add(Projections.property("user.username").as("username"))
.add(Projections.property("institution.institutionName").as("institutionName"));

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还没智能到可以在对象里面检测对象。


写的不对的地方,请指证; 

欢迎大家评论,发表自己的意见。 

 

转载于:https://www.cnblogs.com/aDust/archive/2012/11/08/hibernate_serach.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值