How to handle ClassCastException when trying to cast CLOB to String in Java?

1 day ago 2
ARTICLE AD BOX

I'm maintaining a Java application using Hibernate 5.0.7 to interact with an Oracle 19C database. The data type of remark attribute in orders table is CLOB, java.lang.ClassCastException: com.org.proxy.$Proxy78 cannot be cast to String is thrown when dto.setRemark((String) obj[0]) executes. Pseudo codes are shown blow.

@Entity @Table(name=“orders”) public class Order { ……other fields @Lob @Column private String remark; ……getters & setters } public class OrderDto { ……other fields private String remark; ……getters & setters } public List<OrderDto> getOrderDto() { List<OrderDto> dtos = new ArrayList<>(); Query query = entityManager.createNativeQuery(“SELECT remark, ……other fields FROM orders”); List<Object[]> resultList = query.getResultList(); if(!resultList.isEmpty()) { for(Object[] obj : resultList) { OrderDto dto = new OrderDto(); dto.setRemark((String) obj[0]); …… dtos.add(dto); } } return dtos; }

The approach shown below is given by Poe.

public List<OrderDto> getOrderDto() { List<OrderDto> dtos = new ArrayList<>(); Query query = entityManager.createNativeQuery("SELECT remark, ...other fields FROM orders"); List<Object[]> resultList = query.getResultList(); if(!resultList.isEmpty()) { for(Object[] obj : resultList) { OrderDto dto = new OrderDto(); if(obj[0] instanceof java.sql.Clob) { java.sql.Clob clob = (java.sql.Clob) obj[0]; StringBuilder sb = new StringBuilder(); try(BufferedReader reader = new BufferedReader(clob.getCharacterStream())) { String line = null; while((line = reader.readLine()) != null) { sb.append(line); } } catch(IOException e) { e.printStackTrace(); } dto.setRemark(sb.toString()); } …… dtos.add(dto); } } return dtos; }

I'm not able to evaluate whether this approach is good or not. Does Hibernate provide some built-in APIs to tackle this problem?

190303458's user avatar

2

Read Entire Article