hibernate派生的属性与XML [英] hibernate derived properties with xml

查看:149
本文介绍了hibernate派生的属性与XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有名为Student的表格如下

  ID名称DOB 
--- ---- - -------
1 A 2009-01-28
2 B 2001-05-20

我使用派生属性从hbm文件中的dob获取 AGE

 <休眠映射> 
< class name =com.arat.derived.Persontable =personcatalog =spring_db>
< id name =idtype =int>
< column name =id/>
< generator class =assigned/>
< / id>
< property name =nametype =string>
< column name =name/>
< / property>
< property name =dobtype =date>
< column name =doblength =0/>
< / property>
formula =(选择TIMESTAMPDIFF(YEAR,p.dob,NOW())作为AGE
从person p where p.ID = ID)>< / property>
< / class>
< / hibernate-mapping>

和我的POJO类 Student 具有所有属性id,name,dob和使用setter和getter方法的年龄。

在使用load或get方法获取数据时,我收到错误

  private static void loadPerson(){
Session session = factory.openSession();
Person person =(Person)session.get(Person.class,0);
System.out.println(Person:name+ person.getName()
+,dob:+ person.getDob()+,age:+ person.getAge()) ;





Hibernate:select person0_。 id作为id1_8_0_,person0_.name作为name2_8_0_,person0_.dob作为dob3_8_0_,(作为person0_.AGE从人p处选择TIMESTAMPDIFF(person0_.YEAR,p.dob,NOW())作为person0_.AGE,其中p.ID = person0_.ID)作为formula0_0_从spring_db.person person0_ where person0_.id =?
Feb 07,2015 7:20:22 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN:SQL错误:1064,SQLState:42000
2015年2月7日7: 20:22 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
错误:您的SQL语法错误;请检查与您的MySQL服务器版本相对应的手册,以便在第1行中使用'person0_.YEAR,p.dob,NOW())'作为person0_.AGE(来自人p,其中p.ID = person0_.ID)'')
Feb 07,2015 7:20:22 PM org.hibernate.event.internal.DefaultLoadEventListener onLoad
INFO:HHH000327:执行加载命令时出错:org.hibernate.exception.SQLGrammarException:无法提取ResultSe * *


你能告诉我我错了吗?

解决方案

这是对RadimKöhler的 https://stackoverflow.com/a/28383566/2576551 回答。似乎自定义方言中的关键字注册对于某些休眠版本是区分大小写的。我正在运行hibernate 4.3.8.Final和关键字必须是小写。

  //不起作用
registerKeyword(YEAR);

//作品
registerKeyword(年份);

相关主题更新到3.6.5后,Hibernate映射的属性到SQL公式失败,提出了小写关键字。

I have table called Student as Below

ID        NAME     DOB
---       ----     ---------
1         A        2009-01-28
2         B        2001-05-20

I am using derived properties to get the AGE from the dob as below in the hbm file

<hibernate-mapping>
<class name="com.arat.derived.Person" table="person" catalog="spring_db">
    <id name="id" type="int">
        <column name="id" />
        <generator class="assigned" />
    </id>
    <property name="name" type="string">
        <column name="name" />
    </property>
    <property name="dob" type="date">
        <column name="dob" length="0" />
    </property>
    <property name="age" type="integer" column="AGE"
        formula="( select TIMESTAMPDIFF(YEAR,p.dob,NOW()) as AGE 
                     from person p where p.ID=ID)"></property>
  </class>
</hibernate-mapping>

and my POJO class Student has all the property id,name,dob and age with setter and getter method.

While fetching the data using load or get method I am getting the error

 private static void loadPerson() {
    Session session = factory.openSession();
    Person person = (Person) session.get(Person.class, 0);
    System.out.println("Person : name " + person.getName() 
            + ", dob: " + person.getDob() + ", age : " + person.getAge());

}

Hibernate: select person0_.id as id1_8_0_, person0_.name as name2_8_0_, person0_.dob as dob3_8_0_, ( select TIMESTAMPDIFF(person0_.YEAR,p.dob,NOW()) as person0_.AGE from person p where p.ID=person0_.ID) as formula0_0_ from spring_db.person person0_ where person0_.id=? Feb 07, 2015 7:20:22 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 1064, SQLState: 42000 Feb 07, 2015 7:20:22 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'person0_.YEAR,p.dob,NOW()) as person0_.AGE from person p where p.ID=person0_.ID)' at line 1 Feb 07, 2015 7:20:22 PM org.hibernate.event.internal.DefaultLoadEventListener onLoad INFO: HHH000327: Error performing load command : org.hibernate.exception.SQLGrammarException: could not extract ResultSe**

can you tell me where I am wrong?

解决方案

This is a small addition to the Radim Köhler's https://stackoverflow.com/a/28383566/2576551 answer. It seems like the keyword registration in a custom dialect is case sensitive for some hibernate versions. I am running hibernate 4.3.8.Final and keyword has to be lowercase.

//doesn't work
registerKeyword("YEAR");

//works
registerKeyword("year");

Related thread Hibernate mapped property to SQL formula fails after update to 3.6.5 that proposed to lowercase keyword.

这篇关于hibernate派生的属性与XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆