1 package com.vladmihalcea.hibernate.type.array.internal;
2
3 import org.hibernate.type.descriptor.ValueBinder;
4 import org.hibernate.type.descriptor.ValueExtractor;
5 import org.hibernate.type.descriptor.WrapperOptions;
6 import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
7 import org.hibernate.type.descriptor.sql.BasicBinder;
8 import org.hibernate.type.descriptor.sql.BasicExtractor;
9 import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
10
11 import java.sql.*;
12
13
16 public class ArraySqlTypeDescriptor implements SqlTypeDescriptor {
17
18 public static final ArraySqlTypeDescriptor INSTANCE = new ArraySqlTypeDescriptor();
19
20 @Override
21 public int getSqlType() {
22 return Types.ARRAY;
23 }
24
25 @Override
26 public boolean canBeRemapped() {
27 return true;
28 }
29
30 @Override
31 public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
32 return new BasicBinder<X>(javaTypeDescriptor, this) {
33 @Override
34 protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
35 AbstractArrayTypeDescriptor<Object> abstractArrayTypeDescriptor = (AbstractArrayTypeDescriptor<Object>) javaTypeDescriptor;
36 st.setArray(index, st.getConnection().createArrayOf(
37 abstractArrayTypeDescriptor.getSqlArrayType(),
38 abstractArrayTypeDescriptor.unwrap(value, Object[].class, options)
39 ));
40 }
41
42 @Override
43 protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
44 throws SQLException {
45 throw new UnsupportedOperationException("Binding by name is not supported!");
46 }
47 };
48 }
49
50 @Override
51 public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
52 return new BasicExtractor<X>(javaTypeDescriptor, this) {
53 @Override
54 protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
55 return javaTypeDescriptor.wrap(rs.getArray(name), options);
56 }
57
58 @Override
59 protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
60 return javaTypeDescriptor.wrap(statement.getArray(index), options);
61 }
62
63 @Override
64 protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
65 return javaTypeDescriptor.wrap(statement.getArray(name), options);
66 }
67 };
68 }
69
70 }
71