hibernate 日期类型映射问题--jsonException
程序员文章站
2024-03-02 22:55:58
...
实践场景:将数据库中的对象Material按照时间(date)属性排序输出到一个net.sf.json JSONObject对象中,初始时设置映射文件中time属性hibernate类型为”date”,出现如下错误:
Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.commons.beanutils.PropertyUtils.getSimpleProperty(PropertyUtils.java:1185) at org.apache.commons.beanutils.PropertyUtils.getNestedProperty(PropertyUtils.java:772) at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:801) at net.sf.json.JSONObject.defaultBeanProcessing(JSONObject.java:749) ... 79 more Caused by: java.lang.IllegalArgumentException at java.sql.Date.getHours(Date.java:182) ... 87 more
下述内容则为经过修正映射类型后解决上述问题
hiberante参数映射关系表:
java.util.Date与java.sqlDate
- java.util.Date 就是在除了SQL语句的情况下面使用
-
java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分
继承关系:java.lang.Object –> java.util.Date –> java.sql.Date
java实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author yanzy
* @description 资料智库-材料报告
* @date 2018-04-10 14:17
* @created by intelliJ IDEA
*/
/*
oracle字段 Hibernate映射类型 java类型
number big_decimal java.math.BigDecimal
number(1) boolean Boolean
number(2)2至4之间 byte Byte
number(8)4至8之间 integer Integer
numbernumber(10)8以上 long Long
*/
@Data
public class MaterialPo implements Serializable{
Long id;
String label;
String type;
String imgUrl;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
Date time;
String documentUrl;
Long parentid;
Byte isleaf;
}
映射配置文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="dist.dgp.model.smr.pos.MaterialPo" table="SDD_SMR_MATERIAL">
<id name="id" type="java.lang.Long">
<column name="ID" precision="10" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_SMR_MATERIAL</param>
</generator>
</id>
<property name="label" type="string">
<column name="LABEL"/>
</property>
<property name="type" type="string">
<column name="TYPE"/>
</property>
<property name="imgUrl" type="string">
<column name="IMGURL"/>
</property>
<property name="time" type="java.util.Date">
<column name="TIME"/>
</property>
<property name="documentUrl" type="string">
<column name="DOCUMENTURL"/>
</property>
<property name="parentid" type="long">
<column name="PARENTID"/>
</property>
<property name="isleaf" type="byte">
<column name="ISLEAF"/>
</property>
</class>
</hibernate-mapping>
注意此处time属性的映射配置,类型为java.util.Date
方法调用
底层Dao方法,根据time属性分页获取materialPo列表
public List<POJO> queryContentByPage(final String where,final int startOffset,final int size,final String orderProperty,final boolean ascending){
return (List<POJO>) this.getHibernateTemplate().execute(new HibernateCallback() {
@Override
public Object doInHibernate(org.hibernate.Session session) throws HibernateException,
SQLException {
String hql = "from "+persistentClass.getSimpleName()+" "+where+" order by "+orderProperty+((ascending)? "":" DESC");
Query query = session.createQuery(hql);
query.setFirstResult(startOffset);
query.setMaxResults(size);
return query.list();
}
});
对底层dao方法封装
/**
* 根据time属性排序,分页获取材料报告列表
* @param index 页码,从1开始
* @param size 页大小
* @return
*/
public List<MaterialPo> getMaterialByPage(int index, int size){
return super.queryContentByPage("",index,size,"time",true);
}
Service层方法
@Override
public Object getAllMaterial(Object id, int index, int size) {
try {
if(id==0||id==null){
JSONObject resultObject = new JSONObject();
resultObject.put("materialList", this.materialDao.getMaterialByPage(index,size));
resultObject.put("sum",this.materialDao.loadAll().size());
resultObject.put("index",index);
resultObject.put("size",size);
return resultObject;
}else{
return this.materialDao.get(Long.valueOf(id.toString()));
}
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
this.setErrorMessage(e.getMessage());
return null;
}
其中出现开头错误的位置为: resultObject.put("materialList", this.materialDao.getMaterialByPage(index,size));
即由于time类型转换导致的问题。
下一篇: 解析WPF绑定层次结构数据的应用详解
推荐阅读
-
hibernate 日期类型映射问题--jsonException
-
Java时间和日期类型的Hibernate映射
-
Hibernate3.1.2和Mysql5.0.18映射boolean的问题 HibernateSQL
-
Hibernate3.1.2和Mysql5.0.18映射boolean的问题 HibernateSQL
-
hibernate与mysql映射类型对应表与mysql导入导出
-
hibernate与mysql映射类型对应表与mysql导入导出
-
为什么tinyint(1)映射po类中属性时的字段类型为Boolean 博客分类: 问题汇总 tinyint(1)Boolean
-
为什么tinyint(1)映射po类中属性时的字段类型为Boolean 博客分类: 问题汇总 tinyint(1)Boolean
-
解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题
-
解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题