您的位置:首页 > 其它

Hibernate 多表关联查询示例

2016-07-13 10:49 393 查看
TSettlementPaymentRec,TIsvSettlement,TC001CorpMessage三个Java Bean映射于T_Isv_Settlement,T_Isv_Settlement_Attach
, T_C001_Corp_Messag表

其中T_Isv_Settlement,T_Isv_Settlement_Attach , T_C001_Corp_Messag 已经有主外键关联关系,所以在where条件中用 
‘ AND t.TIsvSettlement=t2 AND t2.TC001CorpMessage=t3’表示关联关系。

testHSQL(){
        String HSQL="  select t.voucherno, t2.memo, t3.name 
          FROM TSettlementPaymentRec t , TIsvSettlement t2 , TC001CorpMessage t3 " +
        " WHERE t2.settlementid = 'S2011042000066' AND t.TIsvSettlement=t2 AND t2.TC001CorpMessage=t3";
        List ltest=this.findByHSQL(HSQL);
}
        /**
         * 根据HQL查询字符串来返回实例集合对象
         * 
         * @param querySql HQL查询字符串
         *            
         * @return 返回object
         */
        public List findByHSQL(final String querySql) {
            try {
                List obj = getHibernateTemplate().find(querySql);

                if (obj != null) {
                    return obj;
                } else {
                    return null;
                }
            } catch (RuntimeException re) {
                throw re;
            }
        }
                
=========================================================================
各文件属性定义(部分)        
TSettlementPaymentRec.java:
public class TSettlementPaymentRec implements java.io.Serializable {

    // Fields

    private String paymentid;
    private TIsvSettlement TIsvSettlement;
    private Double settlementnum;
    private Double amount;
    private String voucherno;
    private String paymenttype;
    private Date paymenttime;
    private String userid;
    private String source;
    
}

TC001CorpMessage.java:
public class TC001CorpMessage implements java.io.Serializable {

    // Fields

    private String userid;
    private String name;
    private String password;
    private String email;
    private String type;
    private String corpname;
    private String commaddress;
    private String commcall;
    private Integer zipcode;
    private String orgcode;
    private String registcode;
    private String registaddress;
    private String legalname;
    private String fax;
    private String contact;
    private String username;
    private String identity;
    private String mobile;
    private String industry;
    private BigDecimal integrity;
    private BigDecimal credit;
    private BigDecimal settlespan;
    private Date createtime;
}

TIsvSettlement.java
public class TIsvSettlement implements java.io.Serializable {

    // Fields

    private String settlementid;
    private TC001CorpMessage TC001CorpMessage;
    private Double settlementnum;
    private Double sum;
    private Date settlementTime;
    private String sendmState;
    private Date sendmTime;
    private String sendmId;
    private String receivemState;
    private Date receivemTime;
    private String recrivemId;
    private String state;
    private String memo;
    private Set TIsvSettlementAttachs = new HashSet(0);

}

TIsvSettlementAttach.java
public class TIsvSettlementAttach implements java.io.Serializable {

    // Fields

    private String id;
    private TIsvSettlement TIsvSettlement;
    private String isvproductno;
    private String usernum;
    private String amount;
    private String settleSum;
    private String sum;
    private Date createtime;
    private String isvuserid;
    private String productid;
    private String unit;
    private Double price;
    private Long buytimes;
    private Double amount2;
    private Date begintime;
    private Date disabletime;
    private String userid;
    private String username;

===========================================================================================================================================================

例子2:
        String HSQL="  select t.voucherno, t2.settleSum, t3.name  FROM TSettlementPaymentRec t , TIsvSettlementAttach t2 , TC001CorpMessage t3 " +
        " WHERE t2.TIsvSettlement.settlementid = 'S2011042000066' AND t.TIsvSettlement=t2.TIsvSettlement AND t2.isvuserid=t3.userid";
        List ltest=this.findByHSQL(HSQL);

取结果:
ArrayList sList = (ArrayList) result;
Iterator iterator1 = sList.iterator();
while (iterator1.hasNext()) {
 Object[] o = (Object[]) iterator1.next();
 tBookInfo bookInfo = (tBookInfo) o[0];
 BookSelection bookSelect = (BookSelection) o[1];
 System.out.println("BookInfo-Title: " + bookInfo.getTitle());
 System.out.println("BookSelection-BookSelectionId: " + bookSelect.getId());


例子3:
        String HSQL="  select  t2.settleSum, t3.name,t4.name  FROM  TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
        " WHERE t2.id like '405' AND t2.isvuserid=t3.userid  AND t4.productid=t2.productid";
        List ltest=this.findByHSQL(HSQL);
        
        int i=0;
        
        
例子4,去重复记录:
        String HSQL="  select  distinct t2.settleSum, t3.name,t4.name  FROM  TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
        " WHERE  t2.isvuserid=t3.userid  AND t4.productid=t2.productid";
        List ltest=this.findByHSQL(HSQL);
        

        
例子5,LIKe查询:
            String HSQL="  select  t2.settleSum, t3.name,t4.name  FROM  TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
            " WHERE t3.name like '%三' AND t2.isvuserid=t3.userid  AND t4.productid=t2.productid";

==================================================================================================================

Hibernate 对左右连接查询的支持不完善,需要做配置XML文件和关联关系才行,比较复杂,对于任意表字段的外连接无法支持。

简单的 做法是用SQL语法把外连接翻译成内连接语法,
Oracle SQL1:
 select   t3.userid,t2.isvuserid,t2.settle_Sum, t3.name from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3  where t2.isvuserid(+)=t3.userid;
 
等于SQL2:
select null as isvuserid,null as settle_Sum ,t3.userid, t3.name 
from  T_C001_Corp_Message t3 where t3.userid not in (select  t2.isvuserid from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3  where t2.isvuserid=t3.userid)
union all
select  t2.isvuserid,t2.settle_Sum, t3.userid,t3.name from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3  where t2.isvuserid=t3.userid;

Hibernate 对 Union不支持。

所以SQL2还必须用两条SQL来做,然后把2个结果集用LIST对象合并list1.addAll(),结果集出来后,还会有排序问题,
就必须自己实现List类中的排序,可以参考这个函数的做法,实现排序类:

import java.util.*;

public class testClass2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TIsvSettlementAttach tisv1 = new TIsvSettlementAttach();
        tisv1.setId("333");
        TIsvSettlementAttach tisv2 = new TIsvSettlementAttach();
        tisv2.setId("222");

        TIsvSettlementAttach tisv3 = new TIsvSettlementAttach();
        tisv3.setId("111");

        List<TIsvSettlementAttach> list = new ArrayList<TIsvSettlementAttach>();
        list.add(tisv1);
        list.add(tisv2);
        list.add(tisv3);

        System.out.println("排序前的list:");
        System.out.println(list);

        
        Collections.sort(list, new Comparator<TIsvSettlementAttach>() {

            public int compare(TIsvSettlementAttach o1, TIsvSettlementAttach o2) {
                // 取出操作时间
                int ret = 0;
                try {
                    ret = (o1.getId()).compareTo(
                            o2.getId());
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                return ret;
            }

        });

        System.out.println("排序后的list:");
        System.out.println(list);
    }

}

 例如:student表和score表需要做联合查询。

    1)sql: select s.id,s.name,sc.score from student as s,score as sc where s.id = sc.userId;

    (字段都是用的数据库中字段名称)

    2)HQL: select s.id,s.name,sc.score from Student as s,Score as sc where s.id = sc.userId;

    (上面字段都是 javabean的属性)

     如果我们按1)查询的话,必须调用 session.createSQLQuery();方法

     如果按2)查询,还是调用 session.createQuery();

     只是要注意,平时我们查询的时候,例如:“from
Student ”查询的结果集 封装的全都是student对象,但是2)执行的结果集里面不是对象,而是一系列数组。需要转换成需要的样式。Hibernate 对左右连接查询的支持不完善,需要做配置XML文件和关联关系才行,比较复杂,对于任意表字段的外连接无法支持。


下面 是查询的一段代码:

Session session = getHibernateTemplate().getSessionFactory()

   .getCurrentSession();

   StringBuffer sb = new StringBuffer(" select user.username,user.truename,user.sex,user.idnum,user.level,s.sumScore from Score as
s,Examuser as user where s.id.userId = user.id
 ");

   if(score != null){

    if(score.getExamId()!=null && !"".equals(score.getExamId())

      && !"null".equals(score.getExamId())){

     sb.append(" and s.examId =:examId ");

    }

    if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())

      && !"null".equals(score.getExamPlace())){

     sb.append(" and s.examPlace =:examPlace ");

    }

    if(score.getUsername()!=null && !"".equals(score.getUsername())

      && !"null".equals(score.getUsername())){

     sb.append(" and s.username like:username ");

    }

   }

   sb.append(" order by s.sumScore desc ");

   Query q = session.createQuery(sb.toString());

   if(score != null){

    if(score.getExamId()!=null && !"".equals(score.getExamId())

      && !"null".equals(score.getExamId())){

     q.setParameter("examId",score.getExamId());

    }

    if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())

      && !"null".equals(score.getExamPlace())){

     q.setParameter("examPlace",score.getExamPlace());

    }

    if(score.getUsername()!=null && !"".equals(score.getUsername())

      && !"null".equals(score.getUsername())){

     q.setParameter("username","%"+score.getUsername()+"%");

    }

   }

   List list = q.list();

需要将查询的结果集 进行一下转换:

List stuList = scoreService.findAllScore(queryScore, null); // 返回的结果集

   if(stuList != null && stuList.size()>0){

    list = new LinkedList();

    StudentScore st;

    for(int i = 0; i < stuList.size();i++){

     st = new StudentScore();

     Object[] object = (Object[])stuList.get(i);// 每行记录不在是一个对象 而是一个数组
     String userId =  (String)object[0];

     String username =  (String)object[1];

     String truename =  (String)object[2];

     String sex =  (String)object[3];

     String idnum =  (String)object[4];

     String level =  (String)object[5];

     Double sumScore =  Double.parseDouble(String.valueOf(object[6]));

     String paperId =  (String)object[7];

     // 重新封装在一个javabean里面

     st.setUserId(userId);

     st.setUsername(username);

     st.setTruename(truename);

     st.setIdnum(idnum);

     st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));

     st.setSex(DictSwitch.getValue("DICT_SEX",sex));

     st.setPaperId(paperId);

     st.setSumScore(sumScore);

     st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));

     list.add(st); // 最终封装在list中 传到前台。

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: