hibernate sql查詢


如果你跟我一樣比較熟悉SQL,同時不想學習一門新的語言。那么在hibernate中使用Native SQL 查詢也是一種不錯的方式。

  • 一方面,Native SQL在效率方面有天生的優勢;
  • 另一方面,SQL是數據庫操作的一種標准,我們與程序、數據庫關聯很小。如果將來不用hibernate,而是用別的ORM,sql一樣好用。

但盡量用標准SQL,而不要用過多方言SQL。

標量查詢

最基本的 SQL 查詢就是獲得一個標量(數值)的列表。

sess.createSQLQuery("SELECT * FROM USER").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM USER").list();

它們都將返回一個 Object 數組(Object[])組成的 List,數組每個元素都是 USER 表的一個字段值。Hibernate 會使用 ResultSetMetadata 來判定返回的標量值的實際順序和類型。

如果不需要在后台進行復雜的處理,可直接將list<Object[]> 轉化為json,交給前台去處理。在處理json時,按照數組的方式遍歷一個item的屬性,屬性值為空對應null。

例如我們前台需要一個json格式的包含userName,address,phone的UserInfo列表,而並不需要account、password等隱私信息。

    public List<Object> findUserInfo(){
        Session session=HibernateUtil.currentSession();
        Transaction tx = null;
        List<Object> infolist=null;
        try {
            tx=session.beginTransaction();
            Query query=session.createSQLQuery("select userName,address,phone from user");
            infolist=query.list();
            tx.commit();
        } catch (HibernateException e) {
            throw e;
        }
        return infolist;
    }

實體查詢

上面的查詢都是返回標量值的,也就是從 resultset 中返回的“裸”數據。下面展示如何通過

addEntity() 讓原生查詢返回實體對象。

sess.createSQLQuery("SELECT * FROM USER").addEntity(User.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM USER").addEntity(User.class);

這個查詢指定:

  • SQL 查詢字符串
  • 要返回的實體

返回單個實體

根據id查詢實體:

    public User getById(Integer id) {
        Session session=HibernateUtil.currentSession();
        Transaction tx = null;
        User user=null;
        try {
            tx=session.beginTransaction();
            user=(User) session.get(User.class, id);
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            throw e;
        }
        return user;
    }

根據unique屬性查詢實體:

    public User findUniqueByProperty(String propertyName,String value) {
        Session session=HibernateUtil.currentSession();
        Transaction tx = null;
        User user = null;
        try {
            tx=session.beginTransaction();
            Query query=session.createQuery("from User where "+propertyName+"=?");
            query.setString(0, value);
            user=(User)query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            throw e;
        }
        return user;
    }

返回一個集合

    public List<User> findAll() {
        Session session=HibernateUtil.currentSession();
        Transaction tx = null;
        List<User> userlist=null;
        try {
            tx=session.beginTransaction();
            Query query=session.createSQLQuery("select * from user").addEntity(User.class);
            userlist=query.list();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            throw e;
        }
        return userlist;
    }

分頁查詢

如果你需要指定結果集的范圍(希望返回的最大行數/或開始的行數),分別應該使用 Query 接口提供的方法:setFirstResult(int firstResult)、setMaxResults(int maxResults)。

分頁查詢是這種應用的一個特殊情況,一頁代表從數據庫某一行開始到某一行結束的結果集。

Query query=session.createSQLQuery("SELECT * FROM USER");
query.setFirstResult((pageIndex - 1) * pageSize);//結果集的起始行
query.setMaxResults(pageSize); //結果集的最大記錄數,也就是一頁的記錄數

下面是一個實例:

    public List<LogDetail> pageQuery(int pageIndex, int pageSize, int adminId) {
        Session session = HibernateUtil.currentSession();
        Transaction tx = null;
        List<LogDetail> logDetailList = null;
        try {
            tx = session.beginTransaction();
            Query query = session
                    .createSQLQuery(
                            "select logdetail.* from logdetail INNER JOIN useradmin on logdetail.userId=useradmin.userId "
                                    + "where adminId=" + adminId +" order by logDate desc")
                                    .addEntity(LogDetail.class);
            query.setFirstResult((pageIndex - 1) * pageSize);
            query.setMaxResults(pageSize);
            logDetailList = query.list();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            throw e;
        }
        return logDetailList;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM