sql >> Databasteknik >  >> RDS >> Oracle

Laddar Clob-data som en sträng (ivrig) via Hibernates org.hibernate.Query

Jag hade precis samma problem, olika länkar föreslog att uppgradera fjädern till 4.0.1+ och viloläge till 4.3.x men detta gjorde ingen skillnad. Sedan hittade jag den här länken som löste mitt problem. Författaren skriver en anpassad ResultTransformer för Clob och ställer sedan in denna som transformator för din fråga istället för AliasToEntityMapResultTransformer.

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

Kod från artikeln nedan:

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;
 }
}

Byt sedan ut

i din kod
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

med

query.setResultTransformer(MyResultTransformer.INSTANCE);

Dessutom kan en alternativ lösning vara att ändra kolumntyp, jag har inte provat det själv.

Källa:http://oreilly.com/java/excerpts/harnessing -hibernate/hibernate-types.html



  1. Returnera array av år som årsintervall

  2. Välj påstående från flera tabeller, med variabel inmatning

  3. CURRENT_DATE/CURDATE() fungerar inte som standardvärde för DATE

  4. selectbox med flera kolumner från mysql-databasen