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 /**
14  * @author Vlad Mihalcea
15  */

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