欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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参数映射关系表:

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

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

相关标签: Hibernate-映射问题