Search in sources :

Example 6 with JPAQuery

use of org.eclipse.persistence.internal.jpa.JPAQuery in project eclipselink by eclipse-ee4j.

the class NamedStoredProcedureQueryMetadata method process.

/**
 * INTERNAL:
 */
@Override
public void process(AbstractSession session) {
    // Build the stored procedure call.
    StoredProcedureCall call = new StoredProcedureCall();
    // Process the stored procedure parameters.
    int index = 1;
    boolean callByIndex = callByIndex();
    boolean hasOutParameters = false;
    for (StoredProcedureParameterMetadata parameter : m_parameters) {
        parameter.processArgument(call, callByIndex, index);
        index++;
        // procedure does not return a result set.
        if (parameter.isOutParameter()) {
            hasOutParameters = true;
        }
    }
    // Process the procedure name.
    call.setProcedureName(m_procedureName);
    // Process the returns result set.
    call.setReturnsResultSet(returnsResultSet(hasOutParameters));
    // Process the multiple result sets.
    call.setHasMultipleResultSets(hasMultipleResultSets());
    // Create a JPA query to store internally on the session.
    JPAQuery query = new JPAQuery(getName(), call, processQueryHints(session));
    if (!m_resultClasses.isEmpty()) {
        // Process the multiple result classes.
        for (MetadataClass resultClass : m_resultClasses) {
            query.addResultClassNames(getJavaClassName(resultClass));
        }
    } else if (!m_resultSetMappings.isEmpty()) {
        // Process the multiple result set mapping.
        query.setResultSetMappings(m_resultSetMappings);
    } else {
        // Legacy support (EclipseLink @NamedStoreProcedureQuery).
        if (!getResultClass().isVoid()) {
            query.setResultClassName(getJavaClassName(getResultClass()));
        } else if (hasResultSetMapping(session)) {
            query.addResultSetMapping(getResultSetMapping());
        }
    }
    addJPAQuery(query, session);
}
Also used : MetadataClass(org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataClass) StoredProcedureCall(org.eclipse.persistence.queries.StoredProcedureCall) JPAQuery(org.eclipse.persistence.internal.jpa.JPAQuery)

Example 7 with JPAQuery

use of org.eclipse.persistence.internal.jpa.JPAQuery in project eclipselink by eclipse-ee4j.

the class QueryOperation method createSimpleXMLFormat.

@SuppressWarnings({ "unchecked" })
public Object createSimpleXMLFormat(XRServiceAdapter xrService, Object value) {
    XMLRoot xmlRoot = new XMLRoot();
    SimpleXMLFormat simpleXMLFormat = result.getSimpleXMLFormat();
    String tempSimpleXMLFormatTag = SimpleXMLFormat.DEFAULT_SIMPLE_XML_FORMAT_TAG;
    String simpleXMLFormatTag = simpleXMLFormat.getSimpleXMLFormatTag();
    if (simpleXMLFormatTag != null && !EMPTY_STR.equals(simpleXMLFormatTag)) {
        tempSimpleXMLFormatTag = simpleXMLFormatTag;
    }
    xmlRoot.setLocalName(tempSimpleXMLFormatTag);
    String tempXMLTag = DEFAULT_SIMPLE_XML_TAG;
    String xmlTag = simpleXMLFormat.getXMLTag();
    if (xmlTag != null && !EMPTY_STR.equals(xmlTag)) {
        tempXMLTag = xmlTag;
    }
    Vector<DatabaseRecord> records = null;
    if (value instanceof ArrayList) {
        // JPA query results in a list of raw values
        // Here we have raw values returned as opposed to DatabaseRecords - this means
        // we need to figure out the tag names based on the call's output parameters.
        // assumes JPAQuery
        JPAQuery jpaQuery = (JPAQuery) queryHandler.getDatabaseQuery();
        // to match field names with results, we need to gather the database fields from each of the Output parameters
        List<DatabaseField> paramFlds = new ArrayList<>();
        DatasourceCall dsCall = (DatasourceCall) jpaQuery.getDatabaseQuery().getDatasourceCall();
        for (Object obj : dsCall.getParameters()) {
            if (obj instanceof OutputParameterForCallableStatement) {
                paramFlds.add(((OutputParameterForCallableStatement) obj).getOutputField());
            } else if (obj instanceof Object[]) {
                Object[] objArray = (Object[]) obj;
                for (int i = 0; i < objArray.length; i++) {
                    Object o = objArray[i];
                    if (o instanceof OutputParameterForCallableStatement) {
                        paramFlds.add(((OutputParameterForCallableStatement) o).getOutputField());
                    }
                }
            }
        }
        // now create a record using DatabaseField/value pairs
        DatabaseRecord dr = new DatabaseRecord();
        if (paramFlds.size() > 0) {
            for (int i = 0; i < ((ArrayList<?>) value).size(); i++) {
                dr.add(paramFlds.get(i), ((ArrayList<?>) value).get(i));
            }
        } else {
            dr.add(new DatabaseField(RESULT_STR), ((ArrayList<?>) value).get(0));
        }
        records = new Vector<>();
        records.add(dr);
    } else if (value instanceof Vector) {
        Class<?> vectorContent = ((Vector<?>) value).firstElement().getClass();
        if (DatabaseRecord.class.isAssignableFrom(vectorContent)) {
            records = (Vector<DatabaseRecord>) value;
        } else {
            records = new Vector<>();
            DatabaseRecord dr = new DatabaseRecord();
            dr.add(new DatabaseField(RESULT_STR), ((Vector<?>) value).firstElement());
            records.add(dr);
        }
    } else {
        records = new Vector<>();
        DatabaseRecord dr = new DatabaseRecord();
        dr.add(new DatabaseField(RESULT_STR), value);
        records.add(dr);
    }
    SimpleXMLFormatModel simpleXMLFormatModel = new SimpleXMLFormatModel();
    XMLConversionManager conversionManager = (XMLConversionManager) xrService.getOXSession().getDatasourcePlatform().getConversionManager();
    SessionLog log = xrService.getOXSession().getSessionLog();
    for (DatabaseRecord dr : records) {
        Element rowElement = TEMP_DOC.createElement(tempXMLTag);
        for (DatabaseField field : dr.getFields()) {
            // handle complex types, i.e. ones we have a descriptor for
            if (field instanceof ObjectRelationalDatabaseField) {
                ObjectRelationalDatabaseField ordtField = (ObjectRelationalDatabaseField) field;
                if (xrService.getOXSession().getDescriptor(ordtField.getType()) != null) {
                    xrService.getXMLContext().createMarshaller().marshal(dr.get(field), rowElement);
                    continue;
                }
            }
            Object fieldValue = dr.get(field);
            if (fieldValue != null) {
                if (fieldValue instanceof Calendar) {
                    Calendar cValue = (Calendar) fieldValue;
                    fieldValue = conversionManager.convertObject(cValue, STRING, DATE_TIME_QNAME);
                }
                if (fieldValue instanceof Date) {
                    Date dValue = (Date) fieldValue;
                    fieldValue = conversionManager.convertObject(dValue, STRING, DATE_QNAME);
                } else if (fieldValue instanceof Time) {
                    Time tValue = (Time) fieldValue;
                    fieldValue = conversionManager.convertObject(tValue, STRING, TIME_QNAME);
                } else if (fieldValue instanceof Timestamp) {
                    Timestamp tsValue = (Timestamp) fieldValue;
                    fieldValue = conversionManager.convertObject(tsValue, STRING, DATE_TIME_QNAME);
                } else if (fieldValue instanceof Blob) {
                    fieldValue = conversionManager.convertObject(fieldValue, ClassConstants.APBYTE);
                } else if (SQLXML.class.isAssignableFrom(fieldValue.getClass())) {
                    // handle XMLType case where an oracle.jdbc.driver.OracleSQLXML instance was returned
                    SQLXML sqlXml = (SQLXML) fieldValue;
                    try {
                        String str = sqlXml.getString();
                        sqlXml.free();
                        // Oracle 12c appends a \n character to the xml string
                        fieldValue = str.endsWith("\n") ? str.substring(0, str.length() - 1) : str;
                    } catch (SQLException e) {
                        log.logThrowable(SessionLog.FINE, SessionLog.DBWS, e);
                    }
                } else if (fieldValue.getClass().getName().equalsIgnoreCase(ORACLEOPAQUE_STR)) {
                    // handle XMLType case where an oracle.sql.OPAQUE instance was returned
                    try {
                        Class<?> oracleOPAQUE;
                        Class<?> xmlTypeFactoryClass;
                        Constructor<?> xmlTypeFactoryConstructor;
                        Object xmlTypeFactory;
                        Method getStringMethod;
                        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                            oracleOPAQUE = AccessController.doPrivileged(new PrivilegedClassForName<>(IORACLEOPAQUE_STR, true, this.getClass().getClassLoader()));
                            xmlTypeFactoryClass = AccessController.doPrivileged(new PrivilegedClassForName<>(XMLTYPEFACTORY_STR, true, this.getClass().getClassLoader()));
                            xmlTypeFactoryConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(xmlTypeFactoryClass, new Class<?>[0], true));
                            xmlTypeFactory = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(xmlTypeFactoryConstructor, new Object[0]));
                            getStringMethod = AccessController.doPrivileged(new PrivilegedGetDeclaredMethod(xmlTypeFactoryClass, GETSTRING_METHOD, new Class<?>[] { oracleOPAQUE }));
                            fieldValue = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getStringMethod, xmlTypeFactory, new Object[] { fieldValue }));
                        } else {
                            oracleOPAQUE = PrivilegedAccessHelper.getClassForName(IORACLEOPAQUE_STR, false, this.getClass().getClassLoader());
                            xmlTypeFactoryClass = PrivilegedAccessHelper.getClassForName(XMLTYPEFACTORY_STR, true, this.getClass().getClassLoader());
                            xmlTypeFactoryConstructor = PrivilegedAccessHelper.getConstructorFor(xmlTypeFactoryClass, new Class<?>[0], true);
                            xmlTypeFactory = PrivilegedAccessHelper.invokeConstructor(xmlTypeFactoryConstructor, new Object[0]);
                            getStringMethod = PrivilegedAccessHelper.getDeclaredMethod(xmlTypeFactoryClass, GETSTRING_METHOD, new Class<?>[] { oracleOPAQUE });
                            fieldValue = PrivilegedAccessHelper.invokeMethod(getStringMethod, xmlTypeFactory, new Object[] { fieldValue });
                        }
                    } catch (ReflectiveOperationException | PrivilegedActionException e) {
                        // if the required resources are not available there's nothing we can do...
                        log.logThrowable(SessionLog.FINE, SessionLog.DBWS, e);
                    }
                }
                String elementName;
                if (field.getName() == null || (elementName = sqlToXmlName(field.getName())).equals(EMPTY_STR)) {
                    // return arg from stored function has no name
                    elementName = RESULT_STR;
                }
                Element columnElement = TEMP_DOC.createElement(elementName);
                rowElement.appendChild(columnElement);
                String fieldValueString = fieldValue.toString();
                // handle binary content - attachments dealt with in invoke() above
                if (result.getType().equals(BASE_64_BINARY_QNAME)) {
                    fieldValueString = Helper.buildHexStringFromBytes(Base64.base64Encode((byte[]) fieldValue));
                    columnElement.setAttributeNS(XMLNS_URL, XSD_STR, SCHEMA_URL);
                    columnElement.setAttributeNS(XMLNS_URL, XSI_STR, SCHEMA_INSTANCE_URL);
                    columnElement.setAttributeNS(SCHEMA_INSTANCE_URL, XSITYPE_STR, BASE64_BINARY_STR);
                }
                columnElement.appendChild(TEMP_DOC.createTextNode(fieldValueString));
            }
        }
        simpleXMLFormatModel.simpleXML.add(rowElement);
    }
    xmlRoot.setObject(simpleXMLFormatModel);
    return xmlRoot;
}
Also used : SQLException(java.sql.SQLException) Element(org.w3c.dom.Element) ArrayList(java.util.ArrayList) Time(java.sql.Time) SimpleXMLFormat(org.eclipse.persistence.internal.xr.sxf.SimpleXMLFormat) DatasourceCall(org.eclipse.persistence.internal.databaseaccess.DatasourceCall) Timestamp(java.sql.Timestamp) PrivilegedGetDeclaredMethod(org.eclipse.persistence.internal.security.PrivilegedGetDeclaredMethod) Vector(java.util.Vector) ObjectRelationalDatabaseField(org.eclipse.persistence.mappings.structures.ObjectRelationalDatabaseField) Blob(java.sql.Blob) DatabaseRecord(org.eclipse.persistence.sessions.DatabaseRecord) XMLRoot(org.eclipse.persistence.oxm.XMLRoot) PrivilegedInvokeConstructor(org.eclipse.persistence.internal.security.PrivilegedInvokeConstructor) Constructor(java.lang.reflect.Constructor) Calendar(java.util.Calendar) Method(java.lang.reflect.Method) PrivilegedGetDeclaredMethod(org.eclipse.persistence.internal.security.PrivilegedGetDeclaredMethod) JPAQuery(org.eclipse.persistence.internal.jpa.JPAQuery) SimpleXMLFormatModel(org.eclipse.persistence.internal.xr.sxf.SimpleXMLFormatModel) Date(java.sql.Date) SessionLog(org.eclipse.persistence.logging.SessionLog) SQLXML(java.sql.SQLXML) OutputParameterForCallableStatement(org.eclipse.persistence.internal.databaseaccess.OutputParameterForCallableStatement) ObjectRelationalDatabaseField(org.eclipse.persistence.mappings.structures.ObjectRelationalDatabaseField) DatabaseField(org.eclipse.persistence.internal.helper.DatabaseField) XMLConversionManager(org.eclipse.persistence.internal.oxm.XMLConversionManager)

Example 8 with JPAQuery

use of org.eclipse.persistence.internal.jpa.JPAQuery in project eclipselink by eclipse-ee4j.

the class JUnitJPQLQueryHelperTestSuite method test_getConstructorQueryMappings_02.

public void test_getConstructorQueryMappings_02() {
    String jpqlQuery = "SELECT NEW org.eclipse.persistence.testing.tests.jpa.jpql.JUnitJPQLQueryHelperTestSuite.MyConstructorClass(" + "   e.lastName, e.id, e.address, e.payScale" + ") " + "FROM Employee e";
    JPAQuery query = new JPAQuery(jpqlQuery);
    query.setSession(getDatabaseSession());
    JPQLQueryHelper helper = new JPQLQueryHelper();
    ConstructorQueryMappings constructorQuery = helper.getConstructorQueryMappings(query.getSession(), query);
    assertNotNull("ConstructorQueryMappings should not be null", constructorQuery);
    assertSame("The query was not cached correctly", query, constructorQuery.getQuery());
    assertTrue("The query is a constructor query", constructorQuery.isConstructorQuery());
    String expectedClassName = MyConstructorClass.class.getName().replace('$', '.');
    assertEquals("The class name should be null", expectedClassName, constructorQuery.getClassName());
    Iterable<DatabaseMapping> mappings = constructorQuery.mappings();
    assertNotNull("The list of mappings cannot be null", mappings);
    assertTrue("The list of mappings should be empty", mappings.iterator().hasNext());
    assertEquals("The count of mappings should be 4", 4, size(mappings));
    int index = 0;
    for (DatabaseMapping mapping : mappings) {
        switch(index++) {
            case 0:
                {
                    assertEquals("lastName", mapping.getAttributeName());
                    break;
                }
            case 1:
                {
                    assertEquals("id", mapping.getAttributeName());
                    break;
                }
            case 2:
                {
                    assertEquals("address", mapping.getAttributeName());
                    break;
                }
            case 3:
                {
                    assertEquals("payScale", mapping.getAttributeName());
                    break;
                }
        }
    }
}
Also used : JPQLQueryHelper(org.eclipse.persistence.internal.jpa.jpql.JPQLQueryHelper) ConstructorQueryMappings(org.eclipse.persistence.internal.jpa.jpql.ConstructorQueryMappings) DatabaseMapping(org.eclipse.persistence.mappings.DatabaseMapping) JPAQuery(org.eclipse.persistence.internal.jpa.JPAQuery)

Example 9 with JPAQuery

use of org.eclipse.persistence.internal.jpa.JPAQuery in project eclipselink by eclipse-ee4j.

the class NamedNativeQueryMetadata method process.

/**
 * INTERNAL:
 */
@Override
public void process(AbstractSession session) {
    // Create a JPA query to store internally on the session.
    JPAQuery query = new JPAQuery(getName(), getQuery(), processQueryHints(session));
    // Process the result class.
    if (!getResultClass().isVoid()) {
        query.setResultClassName(getJavaClassName(getResultClass()));
    } else if (hasResultSetMapping(session)) {
        query.addResultSetMapping(getResultSetMapping());
    }
    addJPAQuery(query, session);
}
Also used : JPAQuery(org.eclipse.persistence.internal.jpa.JPAQuery)

Aggregations

JPAQuery (org.eclipse.persistence.internal.jpa.JPAQuery)9 Vector (java.util.Vector)2 ConstructorQueryMappings (org.eclipse.persistence.internal.jpa.jpql.ConstructorQueryMappings)2 JPQLQueryHelper (org.eclipse.persistence.internal.jpa.jpql.JPQLQueryHelper)2 Constructor (java.lang.reflect.Constructor)1 Method (java.lang.reflect.Method)1 Blob (java.sql.Blob)1 Date (java.sql.Date)1 SQLException (java.sql.SQLException)1 SQLXML (java.sql.SQLXML)1 Time (java.sql.Time)1 Timestamp (java.sql.Timestamp)1 ArrayList (java.util.ArrayList)1 Calendar (java.util.Calendar)1 DatasourceCall (org.eclipse.persistence.internal.databaseaccess.DatasourceCall)1 OutputParameterForCallableStatement (org.eclipse.persistence.internal.databaseaccess.OutputParameterForCallableStatement)1 DatabaseField (org.eclipse.persistence.internal.helper.DatabaseField)1 NonSynchronizedVector (org.eclipse.persistence.internal.helper.NonSynchronizedVector)1 MetadataClass (org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataClass)1 XMLConversionManager (org.eclipse.persistence.internal.oxm.XMLConversionManager)1