zoukankan      html  css  js  c++  java
  • 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还没智能到可以在对象里面检测对象。

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

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

    List results = session.createCriteria(House.class)
        .setProjection( Projections.groupProperty("id")).list(); 
    
    或者
    
    List results = session.createCriteria(House.class)
        .setProjection( Projections.projectionList()
            .add( Projections.property("id")) )
        .list();
  • 相关阅读:
    html笔记
    Git入门学习总结
    使用OpenSSH远程管理Linux服务器
    Linux 网卡驱动的安装
    vi的使用
    Linux下常用的数据恢复工具
    网络文件系统(NFS)的使用
    文件系统管理
    磁盘存储管理
    用户权限管理
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/5763618.html
Copyright © 2011-2022 走看看