使用Hibernate将SQL列的varchar类型映射到java的java.net.URL

使用Hibernate将SQL列的varchar类型映射到java的java.net.URL,java,hibernate,url,hibernate-mapping,hibernate-criteria,Java,Hibernate,Url,Hibernate Mapping,Hibernate Criteria,我在一个表中有一列(名为“url”),其值是url。有些存储为“http://www.test.com“而其他则是一些”blogspot.sometest.com(顺便说一下,这个表不是我的,所以我不能更改结构) 在我的项目中,我将“url”列的内容存储为结构化对象的java.net.urltype属性(例如页面(字符串名称,url);)。所以,如果可能的话,我不想修改这个项目 我希望使用能够获取具有特定id的单个记录。示例代码: @Override public T selectRow(Se

我在一个表中有一列(名为“url”),其值是url。有些存储为“
http://www.test.com
“而其他则是一些”
blogspot.sometest.com
(顺便说一下,这个表不是我的,所以我不能更改结构)

在我的项目中,我将“url”列的内容存储为结构化对象的
java.net.url
type属性(例如页面(字符串名称,url);)。所以,如果可能的话,我不想修改这个项目

我希望使用能够获取具有特定id的单个记录。示例代码:

 @Override
public T selectRow(Serializable id){
    T object = null;
    try {
        openSession();
        trns = session.beginTransaction();
        criteria = session.createCriteria(cl);
                 criteria.add(org.hibernate.criterion.Restrictions.eq("doc_id",id));
        //THIS LINE OF CODE LAUNCH THE EXCEPTION: org.hibernate.HibernateException: Unable to convert string [4bid.it] to URL : java.net.MalformedURLException: no protocol: 4bid.it 
       //BECAUSE FOR SOME OF THE URLS THERE IS NO PROTOCOL...
        List<T> results = criteria.list();
        //SAME WITH THIS
        object = (T) criteria.setFirstResult((Integer) id);

    //THE NEXT LINE OF CODE WORK BUT RETURN NULL FOR URL WITHOUT THE PROTOCOL
    object = (T) session.load(cl, id); 
    } catch (RuntimeException e) {
        if (trns != null) { trns.rollback();}
        SystemLog.exception(e);
    } finally {
        session.flush();
        session.close();
    }
    return object;
}
运行所有Hibernate操作

CRUD休眠操作后:

UPDATE myTable SET url = REPLACE(url, 'http://', '') WHERE url LIKE '%http://%';
更新2 我在setUrl(Url Url)上尝试了@PreUpdate和@PrePersist注释,如下所示:

@PreUpdate
@PrePersist
public void setUrl(URL url) {
    if(url.toString().contains("://")) {
        this.url = url;
    }else{
        try {
            this.url = new URL("http://"+url.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
现在,当我只执行更新、删除、持久化操作时,可以正常工作,但如果您需要类似“@PreLoad”(注意:此注释不存在)的内容,则可以将sql值“www.test.com”转换为“”在java对象上存储之前,我发现最简单的事情就是使用hibernate拦截器。

已经支持,它将VARCHAR列映射到
java.net.URL
属性

您只需使用简单的映射即可:

@Column(name = "url")
private URL url;

是的,如果我只是将协议“http://”添加到记录的值中,您是对的,这很好,但我的问题仍然存在。你知道你是否可以用Hibernate直接处理协议的缺乏?类似于“如果没有协议,您可以将返回值与“http:”连接起来,并保存在对象的映射参数URL中?”尝试使用@PrePersist和PreUpdate JPA回调在插入/修改时修复数据。
@Column(name = "url")
private URL url;