JAVA中如何使用oracle中Clob类型字段
·
最近在项目中做接口对接需要把报文保存到数据库,本来声明列为VARCHAR2类型保存,但是后来在测试的时候发现报文长度过长,orcal中VARCHAR2最大只能保存4000个字符,因此导致错误,后来转为用cloub来保存报文,但是cloub比String操作起来较为麻烦,因此做了一个小demo来整理一下自己实现的方法:
1、建个测试表用来保存,查询数据如下:
-- Create table
create table PRPSSTEST
(
id INTEGER not null,
requestapp VARCHAR2(20),
requestappname VARCHAR2(20),
requestdate DATE,
requestdata CLOB,
responsedate DATE,
responsecode VARCHAR2(10),
responsedata CLOB,
attr VARCHAR2(200),
consumetime INTEGER
)
tablespace TBS_ZSSALE
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
1、根据cloub字段值查询SQL
例:根据请求报文中包含“111”来查询
select * from prpsstest A where dbms_lob.instr(A.REQUESTDATA,'111',1,1) > 0;

2、SSH框架中使用Clob类型字段
实体类如下:
package com.sinosoft.entity;
// Generated by Hibernate Tools 3.2.0.b9 (sinosoft version)
import static javax.persistence.GenerationType.SEQUENCE;
import java.sql.Clob;
import java.util.Date;
import javax.persistence.*;
/**
* generated by Tools.Don't edit.
*/
@Entity
@Table(name = "PRPSSTEST")
public class PrpsSTest implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private long id;
private String requestapp;
private String requestappname;
private Date requestdate;
private Clob requestdata;
private Date responsedate;
private String responsecode;
private Clob responsedata;
private String attr;
private int consumetime;
@SequenceGenerator(name = "generator", allocationSize = 1, sequenceName = "SEQ_prpsstest")
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "generator")
@Column(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "REQUESTAPP")
public String getRequestapp() {
return requestapp;
}
public void setRequestapp(String requestapp) {
this.requestapp = requestapp;
}
@Column(name = "REQUESTAPPNAME")
public String getRequestappname() {
return requestappname;
}
public void setRequestappname(String requestappname) {
this.requestappname = requestappname;
}
@Column(name = "REQUESTDATE")
public Date getRequestdate() {
return requestdate;
}
public void setRequestdate(Date requestdate) {
this.requestdate = requestdate;
}
@Column(name = "REQUESTDATA")
public Clob getRequestdata() {
return requestdata;
}
public void setRequestdata(Clob requestdata) {
this.requestdata = requestdata;
}
@Column(name = "RESPONSEDATE")
public Date getResponsedate() {
return responsedate;
}
public void setResponsedate(Date responsedate) {
this.responsedate = responsedate;
}
@Column(name = "RESPONSECODE")
public String getResponsecode() {
return responsecode;
}
public void setResponsecode(String responsecode) {
this.responsecode = responsecode;
}
@Column(name = "RESPONSEDATA")
public Clob getResponsedata() {
return responsedata;
}
public void setResponsedata(Clob responsedata) {
this.responsedata = responsedata;
}
@Column(name = "ATTR")
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
@Column(name = "CONSUMETIME")
public int getConsumetime() {
return consumetime;
}
public void setConsumetime(int consumetime) {
this.consumetime = consumetime;
}
}
1,java中给cloub字段赋值:
Hibernate.createClob("111")

2、HQL根据CLOUB类型查询条件语句,与sql语句大同小异
![]()
3、查询出来的CLOUB字段转为String
public static String ClobToString(Clob clob) {
String clobStr = "";
Reader is = null;
try {
is = clob.getCharacterStream();
BufferedReader br = new BufferedReader(is);
String s = null;
s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {
sb.append(s);
s = br.readLine();
}
clobStr = sb.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return clobStr;
}
3、SpingBoot JPA框架中使用Clob类型字段
实体类如下:这里为了简便 直接使用String对应数据库中cloub字段
package com.sinosoft.entity;
// Generated by Hibernate Tools 3.2.0.b9 (sinosoft version)
import static javax.persistence.GenerationType.SEQUENCE;
import java.sql.Clob;
import java.util.Date;
import javax.persistence.*;
/**
* generated by Tools.Don't edit.
*/
@Entity
@Table(name = "PRPSSTEST")
public class PrpsSTest implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private long id;
private String requestapp;
private String requestappname;
private Date requestdate;
private String requestdata;
private Date responsedate;
private String responsecode;
private String responsedata;
private String attr;
private int consumetime;
@SequenceGenerator(name = "generator", allocationSize = 1, sequenceName = "SEQ_prpsstest")
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "generator")
@Column(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "REQUESTAPP")
public String getRequestapp() {
return requestapp;
}
public void setRequestapp(String requestapp) {
this.requestapp = requestapp;
}
@Column(name = "REQUESTAPPNAME")
public String getRequestappname() {
return requestappname;
}
public void setRequestappname(String requestappname) {
this.requestappname = requestappname;
}
@Column(name = "REQUESTDATE")
public Date getRequestdate() {
return requestdate;
}
public void setRequestdate(Date requestdate) {
this.requestdate = requestdate;
}
@Lob
@Basic(fetch = FetchType.EAGER)
@Column(name="REQUESTDATA", columnDefinition="CLOB", nullable=true)
public String getRequestdata() {
return requestdata;
}
public void setRequestdata(String requestdata) {
this.requestdata = requestdata;
}
@Column(name = "RESPONSEDATE")
public Date getResponsedate() {
return responsedate;
}
public void setResponsedate(Date responsedate) {
this.responsedate = responsedate;
}
@Column(name = "RESPONSECODE")
public String getResponsecode() {
return responsecode;
}
public void setResponsecode(String responsecode) {
this.responsecode = responsecode;
}
@Lob
@Basic(fetch = FetchType.EAGER)
@Column(name="RESPONSEDATA", columnDefinition="CLOB", nullable=true)
public String getResponsedata() {
return responsedata;
}
public void setResponsedata(String responsedata) {
this.responsedata = responsedata;
}
@Column(name = "ATTR")
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
@Column(name = "CONSUMETIME")
public int getConsumetime() {
return consumetime;
}
public void setConsumetime(int consumetime) {
this.consumetime = consumetime;
}
}
1、使用JPA根据Cloub字段值查询语句:
@Query(value = "select * from PrpsSTest where dbms_lob.instr(requestdata,?1,1,1) > 0 ",nativeQuery = true)
public PrpsSTest getTestByRequestData(String usercode);

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)