Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java sql到hql引发异常_Java_Hibernate_Hql - Fatal编程技术网

Java sql到hql引发异常

Java sql到hql引发异常,java,hibernate,hql,Java,Hibernate,Hql,我在项目中使用hibernate,并试图将现有sql查询从DAO实现类转换为hql 我的sql查询是 JdbcTemplate select = new JdbcTemplate(dataSource); String sql = "SELECT * FROM (SELECT site_id,rtc,sigplan,cycle_time,health,phase_no,phase_time,active_groups,groupscolour,ip "+

我在项目中使用hibernate,并试图将现有sql查询从DAO实现类转换为hql

我的sql查询是

JdbcTemplate select = new JdbcTemplate(dataSource);
    String sql = "SELECT * FROM (SELECT site_id,rtc,sigplan,cycle_time,health,phase_no,phase_time,active_groups,groupscolour,ip "+
                 "FROM status_data where  rtc>='" + fromDate + "' and rtc<'" + toDate + "' and "+
                 "site_id=" + SiteId + " order by rtc desc limit "+recordLimit+" )as temp ORDER BY RTC ASC";

实现结果的正确方法是什么?

首先,如注释中所述,您不能在HQL中的FROM子句中执行子查询。 见:

其次,HQL不支持limit关键字。 通常您会使用
query.setFirstResult(0)
query.setMaxResults(recordLimit)
方法,其中query具有查询接口的类型。但是,因为您在子查询中使用了限制,所以没有办法。 见:

一些选择:

  • 使用本机SQLQuery
  • 因为您只在外部查询中排序。您只能在Java中执行内部查询和排序
  • 选项2的示例:

    Session session = factory.openSession();
    Query query = session
        .createQuery("FROM HealthLog "
            + "WHERE rtc >= :rtcL and rtc < :rtcG and siteId = :siteId "
            + "ORDER BY rtc DESC");
    query.setParameter("rtcL", fromDate);
    query.setParameter("rtcG", toDate);
    query.setParameter("siteId", siteId);
    query.setFirstResult(0);
    query.setMaxResults(recordLimit);
    List<HealthLog> res = query.list();
    session.close();
    
    Collections.sort(res, new Comparator<HealthLog>() {
      public int compare(HealthLog o1, HealthLog o2) {
        return o1.getRtc().compareTo(o2.getRtc());
      }
    });
    
    Session Session=factory.openSession();
    查询=会话
    .createQuery(“来自HealthLog”
    +“其中rtc>=:rtcL和rtc<:rtcG和siteId=:siteId”
    +“rtc DESC指令”);
    query.setParameter(“rtcL”,fromDate);
    query.setParameter(“rtcG”,toDate);
    query.setParameter(“siteId”,siteId);
    query.setFirstResult(0);
    query.setMaxResults(记录限制);
    List res=query.List();
    session.close();
    Collections.sort(res,newcomparator(){
    公共整数比较(HealthLog o1、HealthLog o2){
    返回o1.getRtc().compareTo(o2.getRtc());
    }
    });
    
    上面的查询返回包含所有属性的HealthLogs。如果您只想检索特定属性,您可以在
    HealthLog
    中添加
    selectnewhealthlog(siteId,rtc,sigplan,cycle\u time,…)
    到您的查询中,并在
    HealthLog
    中使用合适的构造函数


    请注意,代码片段可能尚未准备好使用,因为我不知道您的模型和属性名称。

    hibernate的哪个版本?@NicolasFilotto 4.1.9.FinalYou不能在HQL的from子句中使用子查询。
    org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 16 [ select f from (select h from com.traff.hibernate.model.HealthLog as h where rtc>='1974-08-01 14:10:00.0' and rtc <'1974-09-01 23:46:20.6' and siteId = 20 order by rtc desc limit 50000 ) as f order by rtc asc ]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:276)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
    at org.hibernate.hql.intern
    
    Criteria criteria = createEntityCriteria();     
        criteria.add(Restrictions.ge("rtc", fromDate));
        criteria.add(Restrictions.lt("rtc", toDate));
        criteria.add(Restrictions.eq("siteId", siteId));
        criteria.setMaxResults(limit);
        criteria.addOrder(Order.asc("rtc"));            
        criteria2 = criteria;
        criteria2.addOrder(Order.desc("rtc"));      
        return criteria2.list();
    
    Session session = factory.openSession();
    Query query = session
        .createQuery("FROM HealthLog "
            + "WHERE rtc >= :rtcL and rtc < :rtcG and siteId = :siteId "
            + "ORDER BY rtc DESC");
    query.setParameter("rtcL", fromDate);
    query.setParameter("rtcG", toDate);
    query.setParameter("siteId", siteId);
    query.setFirstResult(0);
    query.setMaxResults(recordLimit);
    List<HealthLog> res = query.list();
    session.close();
    
    Collections.sort(res, new Comparator<HealthLog>() {
      public int compare(HealthLog o1, HealthLog o2) {
        return o1.getRtc().compareTo(o2.getRtc());
      }
    });