@Override public final SQLMergeClause merge(RelationalPath<?> path) { return new SQLMergeClause(connection.get(), configuration, path); }
@SuppressWarnings("unchecked") private long executeCompositeMerge() { if (hasRow()) { // update SQLUpdateClause update = new SQLUpdateClause(connection, configuration, entity); populate(update); addKeyConditions(update); return update.execute(); } else { // insert SQLInsertClause insert = new SQLInsertClause(connection, configuration, entity); populate(insert); return insert.execute(); } }
private <T> List<T> executeWithKeys(Class<T> type, @Nullable Path<T> path) { ResultSet rs = null; try{ rs = executeWithKeys(); List<T> rv = new ArrayList<T>(); while (rs.next()) { rv.add(configuration.get(rs, path, 1, type)); } return rv; } catch (SQLException e) { throw configuration.translate(e); }finally { if (rs != null) { close(rs); } reset(); } }
@Override public long execute() { if (configuration.getTemplates().isNativeMerge()) { return executeNativeMerge(); } else { return executeCompositeMerge(); } }
private <T> T executeWithKey(Class<T> type, @Nullable Path<T> path) { ResultSet rs = executeWithKeys(); try{ if (rs.next()) { return configuration.get(rs, path, 1, type); } else { return null; } } catch (SQLException e) { throw configuration.translate(e); }finally{ close(rs); } }
context = startContext(connection, metadata, entity); try { if (configuration.getTemplates().isNativeMerge()) { PreparedStatement stmt = null; if (batches.isEmpty()) { stmt = createStatement(true); listeners.notifyMerge(entity, metadata, keys, columns, values, subQuery); listeners.executed(context); } else { Collection<PreparedStatement> stmts = createStatements(true); if (stmts != null && stmts.size() > 1) { throw new IllegalStateException("executeWithKeys called with batch statement and multiple SQL strings"); if (hasRow()) { populate(update); addKeyConditions(update); return EmptyResultSet.DEFAULT; } else { populate(insert); return insert.executeWithKeys(); onException(context,e); throw configuration.translate(queryString, constants, e); } finally { reset(); endContext(context);
private long executeNativeMerge() { context = startContext(connection, metadata, entity); PreparedStatement stmt = null; Collection<PreparedStatement> stmts = null; try { if (batches.isEmpty()) { stmt = createStatement(false); listeners.notifyMerge(entity, metadata, keys, columns, values, subQuery); return rc; } else { stmts = createStatements(false); listeners.notifyMerges(entity, metadata, batches); long rc = executeBatch(stmts); listeners.executed(context); return rc; onException(context,e); throw configuration.translate(queryString, constants, e); } finally { if (stmt != null) { close(stmt); close(stmts); reset(); endContext(context);
SQLSerializer serializer = createSerializer(); serializer.serializeMerge(metadata, entity, batches.get(0).getKeys(), batches.get(0).getColumns(), listeners.rendered(context); PreparedStatement stmt = prepareStatementAndSetParameters(serializer, withKeys); stmts.put(serializer.toString(), stmt); if (addBatches) { serializer = createSerializer(); serializer.serializeMerge(metadata, entity, batch.getKeys(), batch.getColumns(), batch.getValues(), batch.getSubQuery()); stmt = stmts.get(serializer.toString()); if (stmt == null) { stmt = prepareStatementAndSetParameters(serializer, withKeys); stmts.put(serializer.toString(), stmt); } else { setParameters(stmt, serializer.getConstants(), serializer.getConstantPaths(), metadata.getParams());
@Override public List<SQLBindings> getSQL() { if (batches.isEmpty()) { SQLSerializer serializer = createSerializer(); serializer.serializeMerge(metadata, entity, keys, columns, values, subQuery); return ImmutableList.of(createBindings(metadata, serializer)); } else { ImmutableList.Builder<SQLBindings> builder = ImmutableList.builder(); for (SQLMergeBatch batch : batches) { SQLSerializer serializer = createSerializer(); serializer.serializeMerge(metadata, entity, batch.getKeys(), batch.getColumns(), batch.getValues(), batch.getSubQuery()); builder.add(createBindings(metadata, serializer)); } return builder.build(); } }
@Override public String toString() { SQLSerializer serializer = createSerializer(); serializer.serializeMerge(metadata, entity, keys, columns, values, subQuery); return serializer.toString(); }
private boolean hasRow() { SQLQuery query = new SQLQuery(connection, configuration).from(entity); addKeyConditions(query); return query.exists(); }
private PreparedStatement createStatement(boolean withKeys) throws SQLException { boolean addBatches = !configuration.getUseLiterals(); listeners.preRender(context); SQLSerializer serializer = createSerializer(); PreparedStatement stmt = null; if (batches.isEmpty()) { stmt = prepareStatementAndSetParameters(serializer, withKeys); context.addPreparedStatement(stmt); listeners.prepared(context); listeners.rendered(context); stmt = prepareStatementAndSetParameters(serializer, withKeys); SQLMergeBatch batch = batches.get(i); listeners.preRender(context); serializer = createSerializer(); serializer.serializeMerge(metadata, entity, batch.getKeys(), batch.getColumns(), batch.getValues(), batch.getSubQuery()); context.addSQL(serializer.toString()); listeners.rendered(context); setParameters(stmt, serializer.getConstants(), serializer.getConstantPaths(), metadata.getParams()); if (addBatches) { stmt.addBatch();