【问题标题】:How to manipulate the SQLQuery result in Hibernate?如何在 Hibernate 中操作 SQLQuery 结果?
【发布时间】:2018-06-26 20:16:03
【问题描述】:

我是 Hibernate 的新手,我需要一些自定义查询,所以我使用 SQLQuery 以下是我正在使用的代码。

List getResult(String queryString, List<String> bindList, String className)  {

        SQLQuery sqlQuery = session.createSQLQuery(queryString);

        int i=0;
        for (String value : bindList) {
            query.setString(i, value);
            i++;
        }

        if(className != null)
        {
            sqlQuery.setResultTransformer(Transformers.aliasToBean(Class.forName(className)));
        }

}

这里的问题是其中一个列值作为 clob 类型返回,但与 clob 匹配的相应 DTO 值的类型是 String,因此我必须将该 clob 值更改为 String。有什么好的解决方案吗?

据我所知,sqlQuery 有 list() 方法,它返回对象集合,包括查询结果行。那么有什么方法可以操纵该列表的内容吗?

我尝试的方式如下。我有通过执行查询返回的三列值,布尔值,字符串和字符串(从clob转换而来)

List<Object[]> rows = sqlQuery.list();
row = rows.get(0);

java.sql.Clob cValue = (java.sql.Clob)row[2];
String str_value = cValue.getSubString(1, (int)cValue.length());

List<Object[]> rows = new ArrayList<Object[]>();
        Object[] obj = new Object[3];
        obj[0] = new Boolean(row[0]);
        obj[1] = new String(row[1]);
        obj[2] = new String(str_value);
        rows.add(obj);
return rows;

但是日志说 java.lang.ClassCastException:[Ljava.lang.Object;不能转换为 SourceDTO。 (有点预期)我在想的是我认为我可以操纵结果列表并使用匹配的 SourceDTO 返回它。任何人都可以对此有一些解决方案吗?

【问题讨论】:

    标签: hibernate clob


    【解决方案1】:

    使用getAsciiStream() 获取CLOB 对象的输入流并将其传递给copy() 方法。

    InputStream in = clobObject.getAsciiStream();
    StringWriter w = new StringWriter();
    IOUtils.copy(in, w);
    String clobAsString = w.toString();
    

    【讨论】:

    • 是的,我能够将 clob 类型转换为字符串,但问题是如何使它与我现在拥有的 DTO 匹配。还有,上面代码中,什么是IOUtils,这是java默认提供的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2016-04-05
    • 2013-04-11
    • 2018-07-18
    相关资源
    最近更新 更多