用SQL中的datepart()函数
datepart(year,'2004-1-1')   --返回INT的2004

解决方案 »

  1.   

    楼上说的对,用sql server提供的函数,不过最好能用hql提供的函数,很久没用了,既不太清有没有了
      

  2.   

    datepart(year,convert(datetime,'2004-1-1'))
      

  3.   

    楼上的大哥,在我的写的HQL里这些都不认呢!有没有HQL的函数啊
      

  4.   

    应该会认的吧
    取得session以后
    String hql = select datepart(year,convert(datetime,'2004-1-1')) from XX as xx
    Query q = session.createQuery(hql);
    List list = q.list();
    还有,我从来没碰到过你说的比如substring()、SimpleDateFormat会出错问题
    都很好用啊~~还有你的问题只需要 1900 + date.getYear() 就行了吧
    我的xml配置为
    <property column="zxrq" length="23" name="zxrq" type="timestamp"/>
      

  5.   

    eec2d0f SystemErr     R net.sf.hibernate.QueryException: undefined alias: datepart select      a.Id,     b.AppraiseObjectName,     c.CorporationTypeName,     d.Xmmc,     a.InvestValue,     datepart(year,convert(datetime,a.AppraiseDate)),     a.SatisfactionLevel,     a.AppraiseMainBody  from  ......    为什么我的会出这样的问题呢?望指教......
      

  6.   

    显示的错误是没有定义的别名datepart,看上去好象是不认这个方法因为我也没在hibernate里面用过datepart,hibernate只是对jdbc轻度封装,我本来想像count(),sum()这种方法行的话datepart也应该行你等我先去实验一下
      

  7.   

    恩~好象HQL不支持datepart,你就用SQL查询好了
    String sql = select datepart(year,xx.date) from XX as xx;
    Query sqlQuery = sess.createSQLQuery(sql);
    List list = q.list();
      

  8.   

    Query sqlQuery = sess.createSQLQuery(这里要三个参数吧);都什么呢?你知道吗?
      

  9.   

    看代码:
    strSQL
    .append(" select ")
    .append("     a.Id,")
    .append("     b.AppraiseObjectName,")
    .append("     c.CorporationTypeName,")
    .append("     d.Xmmc,")
    .append("     a.InvestValue,")
    .append("     datepart(year,a.AppraiseDate),")
    .append("     a.SatisfactionLevel,")
    .append("     a.AppraiseMainBody ")
    .append(" from ")
    .append("     AppsAppraiseReport a,")
    .append("     AppsAppraiseObject b,")
    .append("     AppsCorporationType c,")
    .append("     AppsImportenceItemList d")
    .append(" where ")
    .append("     a.AppraiseDate >= '")
    .append(strCurrentYear + "'")
    .append("     and ")
    .append("     a.AppraiseDate < '")
    .append(strNextYear + "'")
    .append("     and ")
    .append("     b.Id = a.AppraiseObjectId")
    .append("     and ")
    .append("     d.Id.Xmbm = a.Xmbm")
    .append("     and ")
    .append("     c.Id = b.Id")
    .append(" order by ")
    .append("     a.AppraiseDate ")
    .append(" desc");

    String[] bm={"a","b","c","d"};
    Class[] bclass=new Class[4];
    bclass[0]=AppsAppraiseReport.class;
    bclass[1]=AppsAppraiseObject.class;
    bclass[2]=AppsCorporationType.class;
    bclass[3]=AppsImportenceItemList.class;


    Session session = _RootDAO.createSession();
    Query query=session.createSQLQuery(strSQL.toString(),bm,bclass); List ls=query.list();
    错误:
    1、对象名‘AppsAppraiseReport' 无效
    2、对象名 'AppsAppraiseObject' 无效
    3、对象名 'AppsCorporationType' 无效
    4、对象名 'AppsImportenceItemList' 无效这是为什么呢?这几类都有,都是正确的啊,望指教!
      

  10.   

    换成下面的代码还是出错:

                      String[] bm={"a","b","c","d"};
    Class[] bclass=new Class[4];
    AppsAppraiseReport a=new AppsAppraiseReport();
    AppsAppraiseObject b=new AppsAppraiseObject();
    AppsCorporationType c=new AppsCorporationType();
    AppsImportenceItemList d=new AppsImportenceItemList();

    bclass[0]=a.getClass();
    bclass[1]=b.getClass();
    bclass[2]=c.getClass();
    bclass[3]=d.getClass();帮帮忙啊,烦人!
      

  11.   

    和普通的HQL查询一样,SQL查询同样是从Query接口开始的。惟一的区别是使用Session.createSQLQuery()方法。 Query sqlQuery = sess.createSQLQuery("select {cat.*} from cats {cat}", "cat", Cat.class);
    sqlQuery.setMaxResults(50);
    List cats = sqlQuery.list();
    传递给createSQLQuer()的三个参数是: SQL查询语句 表的别名 查询返回的持久化类 别名是为了在SQL语句中引用对应的类(本例中是Cat)的属性的。你也可以传递一个别名的String 数组和一个对应的Class的数组进去,每行就可以得到多个对象。 15.2. 别名和属性引用
    上面使用的{cat.*}标记是“所有属性的”的简写。你可以显式的列出需要的属性,但是你必须让Hibernate为每个 属性提供SQL列别名。这些列的的占位表示符是以表别名为前导,再加上属性名。下面的例子中,我们从一个其它的表(cat_log) 中获取Cat对象,而非Cat对象原本在映射元数据中声明的表。注意你在where子句中也可以使用 属性别名。 String sql = "select cat.originalId as {cat.id}, cat.mateid as {cat.mate}, cat.sex as {cat.sex}, cat.weight*10 as {cat.weight}, cat.name as {cat.name}"
        + " from cat_log cat where {cat.mate} = :catId"
    List loggedCats = sess.createSQLQuery(sql, "cat", Cat.class)
    .setLong("catId", catId)
    .list();注意: 如果你明确的列出了每个属性,你必须包含这个类和它的子类的属性! //?? 
      

  12.   

    难道你直接返回date类型的数据会出错吗?
    如果不会你就可以用1900 + date.getYear()得到年份了啊。。根本不用提交SQL那样麻烦。。
      

  13.   

    试过了,加上别名还是一样的错误:
    1、对象名‘AppsAppraiseReport' 无效
    2、对象名 'AppsAppraiseObject' 无效
    3、对象名 'AppsCorporationType' 无效
    4、对象名 'AppsImportenceItemList' 无效
    代码如下:
    strSQL
    .append(" select ")
    .append("     a.Id as {a.id},")
    .append("     b.AppraiseObjectName as {b.AppraiseObjectName},")
    .append("     c.CorporationTypeName as {c.CorporationTypeName},")
    .append("     d.Xmmc as {d.Xmmc},")
    .append("     a.InvestValue as {a.InvestValue},")
    .append("     datepart(year,a.AppraiseDate) as {a.AppraiseDate},")
    .append("     a.SatisfactionLevel as {a.SatisfactionLevel},")
    .append("     a.AppraiseMainBody as {a.AppraiseMainBody}")
    .append(" from ")
    .append("     AppsAppraiseReport a,")
    .append("     AppsAppraiseObject b,")
    .append("     AppsCorporationType c,")
    .append("     AppsImportenceItemList d")
    .append(" where ")
    .append("     a.AppraiseDate >= '")
    .append(strCurrentYear + "'")
    .append("     and ")
    .append("     a.AppraiseDate < '")
    .append(strNextYear + "'")
    .append("     and ")
    .append("     b.Id = a.AppraiseObjectId")
    .append("     and ")
    .append("     d.Id.Xmbm = a.Xmbm")
    .append("     and ")
    .append("     c.Id = b.Id")
    .append(" order by ")
    .append("     a.AppraiseDate ")
    .append(" desc");

    String[] bm={"a","b","c","d"};
    Class[] bclass=new Class[4];
    AppsAppraiseReport a=new AppsAppraiseReport();
    AppsAppraiseObject b=new AppsAppraiseObject();
    AppsCorporationType c=new AppsCorporationType();
    AppsImportenceItemList d=new AppsImportenceItemList();
                      
    bclass[0]=a.getClass();
    bclass[1]=b.getClass();
    bclass[2]=c.getClass();
    bclass[3]=d.getClass();

    Session session = _RootDAO.createSession();
    Query query=session.createSQLQuery(
                                     strSQL.toString(),bm,bclass);这上面的四个类都没有子类的,而且bm和bclass都已经赋值了啊,为什么还是有错误?麻烦再帮我看看!