1 package com.vladmihalcea.hibernate.type.search.internal;
2
3 import com.vladmihalcea.hibernate.util.ReflectionUtils;
4 import org.hibernate.type.descriptor.ValueBinder;
5 import org.hibernate.type.descriptor.ValueExtractor;
6 import org.hibernate.type.descriptor.WrapperOptions;
7 import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
8 import org.hibernate.type.descriptor.sql.BasicBinder;
9 import org.hibernate.type.descriptor.sql.BasicExtractor;
10 import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
11
12 import java.sql.*;
13
14 public class PostgreSQLTSVectorSqlTypeDescriptor implements SqlTypeDescriptor {
15
16 public static final PostgreSQLTSVectorSqlTypeDescriptor INSTANCE = new PostgreSQLTSVectorSqlTypeDescriptor();
17
18 @Override
19 public int getSqlType() {
20 return Types.OTHER;
21 }
22
23 @Override
24 public boolean canBeRemapped() {
25 return false;
26 }
27
28 @Override
29 public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
30 return new BasicBinder<X>(javaTypeDescriptor, this) {
31 @Override
32 protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
33 Object holder = ReflectionUtils.newInstance("org.postgresql.util.PGobject");
34 ReflectionUtils.invokeSetter(holder, "type", "tsvector");
35 ReflectionUtils.invokeSetter(holder, "value", javaTypeDescriptor.unwrap(value, String.class, options));
36 st.setObject(index, holder);
37 }
38
39 @Override
40 protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
41 throws SQLException {
42 Object holder = ReflectionUtils.newInstance("org.postgresql.util.PGobject");
43 ReflectionUtils.invokeSetter(holder, "type", "tsvector");
44 ReflectionUtils.invokeSetter(holder, "value", javaTypeDescriptor.unwrap(value, String.class, options));
45
46 st.setObject(name, holder);
47 }
48 };
49 }
50
51 @Override
52 public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
53 return new BasicExtractor<X>(javaTypeDescriptor, this) {
54 @Override
55 protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
56 return javaTypeDescriptor.wrap(rs.getString( name ), options);
57 }
58
59 @Override
60 protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
61 return javaTypeDescriptor.wrap(statement.getString(index), options);
62 }
63
64 @Override
65 protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
66 return javaTypeDescriptor.wrap(statement.getString(name), options);
67 }
68 };
69 }
70 }
71