PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

हाइबरनेट, पोस्टग्रेज और ऐरे टाइप

मैंने जेडीबीसी4 द्वारा पेश किए गए ऐरे प्रकार के आधार पर कुछ संस्करणों की कोशिश की:मैं मूल क्वेरी में स्ट्रिंग [] पैरामीटर कैसे सेट कर सकता हूं? । समस्या हाइबरनेट भी है (पिछले संस्करण 4.3.1.फाइनल में भी) इस नई सुविधाओं के साथ काम नहीं करता है और मुझे निम्नलिखित त्रुटि संदेश देता है

Could not determine a type for class: org.postgresql.jdbc4.Jdbc4Array

तो मुझे एक विशिष्ट उपयोगकर्ता प्रकार बनाना पड़ा (स्टैक ओवरफ्लो में कई लेखों और अन्य स्रोतों के आधार पर)

मेरा मॉडल

@Type(type = "fr.mycompany.dao.hibernate.types.ArrayUserType")
private String[] values;

मेरा ArrayUserType

public class ArrayUserType implements UserType {

/** Constante contenant le type SQL "Array".
 */
protected static final int[] SQL_TYPES = { Types.ARRAY };

/**
 * Return the SQL type codes for the columns mapped by this type. The
 * codes are defined on <tt>java.sql.Types</tt>.
 * 
 * @return int[] the typecodes
 * @see java.sql.Types
 */
public final int[] sqlTypes() {
    return SQL_TYPES;
}

/**
 * The class returned by <tt>nullSafeGet()</tt>.
 * 
 * @return Class
 */
public final Class returnedClass() {
    return String[].class;
}

/**
 * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
 * should handle possibility of null values.
 * 
 * @param resultSet a JDBC result set.
 * @param names the column names.
 * @param session SQL en cours.
 * @param owner the containing entity 
 * @return Object
 * @throws org.hibernate.HibernateException exception levée par Hibernate
 * lors de la récupération des données.
 * @throws java.sql.SQLException exception SQL 
 * levées lors de la récupération des données.
 */
@Override
public final Object nullSafeGet(
        final ResultSet resultSet, 
        final String[] names, 
        final SessionImplementor session, 
        final Object owner) throws HibernateException, SQLException {
    if (resultSet.wasNull()) {
        return null;
    }

    String[] array = (String[]) resultSet.getArray(names[0]).getArray();
    return array;
}

/**
 * Write an instance of the mapped class to a prepared statement. Implementors
 * should handle possibility of null values. A multi-column type should be written
 * to parameters starting from <tt>index</tt>.
 * 
 * @param statement a JDBC prepared statement.
 * @param value the object to write
 * @param index statement parameter index
 * @param session sql en cours
 * @throws org.hibernate.HibernateException exception levée par Hibernate
 * lors de la récupération des données.
 * @throws java.sql.SQLException exception SQL 
 * levées lors de la récupération des données.
 */
@Override
public final void nullSafeSet(final PreparedStatement statement, final Object value, 
        final int index, final SessionImplementor session) throws HibernateException, SQLException {

    if (value == null) {
        statement.setNull(index, SQL_TYPES[0]);
    } else {
        String[] castObject = (String[]) value;
        Array array = session.connection().createArrayOf("text", castObject);
        statement.setArray(index, array);
    }
}

@Override
public final Object deepCopy(final Object value) throws HibernateException {
    return value;
}

@Override
public final boolean isMutable() {
    return false;
}

@Override
public final Object assemble(final Serializable arg0, final Object arg1)
        throws HibernateException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public final Serializable disassemble(final Object arg0) throws HibernateException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public final boolean equals(final Object x, final Object y) throws HibernateException {
    if (x == y) {
        return true;
    } else if (x == null || y == null) {
        return false;
    } else {
        return x.equals(y);
    }
}

@Override
public final int hashCode(final Object x) throws HibernateException {
    return x.hashCode();
}

@Override
public final Object replace(
    final Object original,
    final Object target,
    final Object owner) throws HibernateException {
    return original;
}

}

और आखिरी, लेकिन कम से कम (यही वह है जो मुझे याद आया):जब मुझे SQL मूल क्वेरी चलाने की आवश्यकता होती है, तो मुझे पैरामीटर प्रकार को निम्न सिंटैक्स के साथ मजबूर करना पड़ता है

String[] values = ...
Type arrayType = new CustomType(new ArrayUserType());
query.setParameter("value", values, arrayType);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्कीमा पर उपयोग अनुदान वास्तव में क्या करता है?

  2. Java का उपयोग करके Postgresql में छवियों को संग्रहीत और पुनर्प्राप्त करें

  3. तारों को संग्रहित करने के लिए डेटा प्रकार टेक्स्ट का उपयोग करने का कोई डाउनसाइड्स?

  4. #या को दिया गया संबंध संरचनात्मक रूप से संगत होना चाहिए। असंगत मान:[:संदर्भ]

  5. PostgreSQL में ON CONFLICT के साथ RETURNING का उपयोग कैसे करें?