hibernate 日期类型映射问题--jsonException

实践场景:将数据库中的对象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参数映射关系表:

hibernate参数映射关系表1
hibernate参数映射关系表2

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类型转换导致的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值