Reputation: 8710
I have a to save a pdf report into an Oracle DB. The report's dataType is a byteArray.
The domain definition is as follows:
static constraints = {
report(nullable:false)
company(nullable:false)
month(nullable:false)
}
byte[] report
Company company
Date month
}
Unfortunately this defines in the Oracle DB a field which has A RAW data_type and a lenghth of 255.
How should I define this field into the domain class? Should be defined as a BLOB?
If yes, How to do this?
Thanks in advance.
Upvotes: 7
Views: 4163
Reputation: 955
Based on Michael Borgwardt answer, here is what I did to solve this problem:
import java.sql.Blob
import org.hibernate.lob.BlobImpl
class Pagina {
Blob reportBlob
static mapping = {
reportBlob column: 'PAGI_TX_DADOS', type: 'blob'
}
def setReport(byte[] bytes) {
if (bytes != null) {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes)
int length = bytes.length
reportBlob = new BlobImpl(bais,length)
}
}
def getReport() {
return reportBlob?.binaryStream
}
}
Upvotes: 1
Reputation: 106
255 is the default size provided to a byte[]. Specify the max size for report in constraints as per your requirement. Something like:
static constraints = {
report(maxSize: 50000000)
}
Based on max size, the field type in DB will be set. (mediumblob, longblob etc.)
Upvotes: 7
Reputation: 346300
Here's a blog article that promises to solve this problem. The trick seems to be to have a field of type java.sql.Blob
, with the byte[]
field derived from that and marked as transient.
Upvotes: 1
Reputation: 11035
Try explicitly setting the type to either a 'blob' or 'binary', for example you can add the following to the domain class:
static mapping = {
report type:'blob'
}
Upvotes: 1