0

I'm using Postgres 9 and Hibernate 4 as ORM.

In Postgres there is an option of creating a table with json type column.

I would like in my Java code to be able to send JSONObject in queries so they would be transformed\converted to Postgres type.

How can I do that?

I need to Object:

  1. The first object extends from UserType.
  2. The 2nd object extends: extends AbstractSingleColumnStandardBasicType implements DiscriminatorType.

Is there any example for that??

Vlad Mihalcea
156k85 gold badges597 silver badges984 bronze badges
asked Jun 18, 2014 at 9:09

2 Answers 2

2

You don’t have to create all these types manually, you can simply get them via Maven Central using the following dependency:

<dependency>
 <groupId>com.vladmihalcea</groupId>
 <artifactId>hibernate-types-52</artifactId>
 <version>1.0.0</version>
</dependency>

For more info, check out the Hibernate Types open-source project.

Now, your mapping can use the JsonType, like this:

@Entity(name = "Book")
@Table(name = "book")
@TypeDef(
 name = "json", 
 typeClass = JsonType.class
)
public class Book {
 
 @Id
 @GeneratedValue
 private Long id;
 
 @NaturalId
 private String isbn;
 
 @Type( type = "json" )
 @Column(columnDefinition = "jsonb")
 private JsonNode properties;
 
 //Getters and setters omitted for brevity
}

That's it!

answered Jun 18, 2014 at 9:19
Sign up to request clarification or add additional context in comments.

Comments

0

Just had to spend some time on this and this worked for me:

 public class JSONUserType implements UserType {
 private static final int[] SQL_TYPES = { Types.LONGVARCHAR };
 @Override
 public Object assemble(Serializable cached, Object owner)
 throws HibernateException {
 return deepCopy(cached);
 }
 @Override
 public Object deepCopy(Object value) throws HibernateException {
 if (value == null)
 return value;
 try {
 return new JSONObject(((JSONObject) value).toString());
 } catch (JSONException e) {
 throw new RuntimeException(e);
 }
 }
 @Override
 public Serializable disassemble(Object value) throws HibernateException {
 return ((JSONObject) value).toString();
 }
 @Override
 public boolean equals(Object x, Object y) throws HibernateException {
 if (x == null)
 return (y != null);
 return (x.equals(y));
 }
 @Override
 public int hashCode(Object x) throws HibernateException {
 return ((JSONObject) x).toString().hashCode();
 }
 @Override
 public boolean isMutable() {
 return true;
 }
 @Override
 public Object replace(Object original, Object target, Object owner)throws HibernateException {
 return deepCopy(original);
 }
 @Override
 @SuppressWarnings("unchecked")
 public Class returnedClass() {
 return JSONObject.class;
 }
 @Override
 public int[] sqlTypes() {
 return SQL_TYPES;
 }
 @Override
 public Object nullSafeGet(ResultSet rs, String[] names,SessionImplementor session, Object owner)throws HibernateException, SQLException {
 String jsonString = rs.getString(names[0]);
 if (jsonString == null)
 return null;
 try {
 return new JSONObject(jsonString);
 } catch (JSONException e) {
 throw new RuntimeException(e);
 }
 }
 @Override
 public void nullSafeSet(PreparedStatement st, Object value, int index,SessionImplementor session) throws HibernateException, SQLException {
 if (value == null) {
 st.setNull(index, Types.OTHER);
 } else {
 st.setObject(index, ((JSONObject) value).toString(),Types.OTHER);
 }
 }
}
Hitesh Modha
2,7885 gold badges31 silver badges47 bronze badges
answered Oct 23, 2014 at 13:54

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.