我遇到了以下问题,该问题似乎是pretty common。例外是Cannot update entity: [...] nested exception is java.sql.BatchUpdateException: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column
。看起来Oracle不喜欢在LOB或CLOB之后将大值(> 4000个字符)绑定到参数。有人解决了这个问题吗?
答案 0 :(得分:9)
这是:ORA-24816
**这是一个限制,LONG绑定变量必须在语句中排在最后。 **
来源:http://www.odi.ch/weblog/posting.php?posting=496
解决方案:通过重命名hibernate模型中的字段,以便按字母顺序排序时,clob列的名称晚于varchar2列(我在java类中使用'z'<前缀为clob字段/ strong>),一切正常,因为clob参数位于查询hibernate构建中的varchar参数之后。
答案 1 :(得分:2)
我们遇到了与Hibernate 3.2.1相同的问题,并通过先插入没有CLOB的记录然后用CLOB更新该记录来修复。
public class Employee{
@Lob
@Column
private String description;
//getters setters
}
String desc = emp.getDescription();
emp.setDescription(null);
session.save(entity);
session.flush();
session.evict(entity);
StringBuilder sb = new StringBuilder();
sb.append("update Employee set description:description");
Query updateQuery = session.createQuery(sb.toString());
updateQuery.setParameter("description", desc, Hibernate.STRING);
updateQuery.executeUpdate();
如果您正在使用Hibernate注释,则无法预测insert语句中列的顺序。这已在Hibernate v4.1.8中修复。