Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Laden von Clob-Daten als String (eifrig) über Hibernates org.hibernate.Query

Ich hatte gerade das gleiche Problem, verschiedene Links schlugen vor, Spring auf 4.0.1+ zu aktualisieren und auf 4.3.x in den Ruhezustand zu versetzen, aber das machte keinen Unterschied. Dann bin ich auf diesen Link gestoßen, der mein Problem gelöst hat. Der Autor schreibt einen benutzerdefinierten ResultTransformer für den Clob und legt diesen dann anstelle von AliasToEntityMapResultTransformer als Transformer für Ihre Abfrage fest.

http://javatechtricks.blogspot.co .uk/2012/12/hibernate-clob-to-string-conversion.html

Code aus dem folgenden Artikel:

public class MyResultTransformer extends BasicTransformerAdapter {

 public final static MyResultTransformer INSTANCE;
 static {
  INSTANCE = new MyResultTransformer();
 }

 private MyResultTransformer() {

 }
 private static final long serialVersionUID = 1L;

 @Override
 public Object transformTuple(Object[] tuple, String[] aliases) {
  Map<String, Object> map = new HashMap<String, Object>();
  for (int i = 0; i < aliases.length; i++) {
   Object t = tuple[i];
   if (t != null && t instanceof Clob) {
    Clob c = (Clob) tuple[i];
    try {
     ByteArrayOutputStream bos = new ByteArrayOutputStream();
     IOUtils.copy(c.getAsciiStream(), bos);
     t = new String(bos.toByteArray());
    } catch (SQLException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   map.put(aliases[i], t);
  }
  return map;
 }
}

Ersetzen Sie dann in Ihrem Code

query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

mit

query.setResultTransformer(MyResultTransformer.INSTANCE);

Außerdem könnte eine alternative Lösung darin bestehen, den Spaltentyp zu ändern, ich habe es selbst nicht versucht.

Quelle:http://oreilly.com/java/excerpts/harnessing -hibernate/hibernate-types.html