Java 类org.hibernate.query.NativeQuery 实例源码
项目:flow-platform
文件:JobDaoImpl.java
@Override
public List<Job> latestByPath(List<String> paths) {
return execute((Session session) -> {
final StringBuilder query = new StringBuilder(JOB_QUERY);
if (!CollectionUtil.isNullOrEmpty(paths)) {
query.append(" where id in (select max(id) from job where node_path in (:paths) group by node_path)");
} else {
query.append(" where id in (select max(id) from job group by node_path)");
}
NativeQuery nativeQuery = session
.createNativeQuery(query.toString())
.setResultSetMapping("MappingJobResult");
if (!CollectionUtil.isNullOrEmpty(paths)) {
nativeQuery.setParameterList("paths", paths);
}
List<Object[]> objects = nativeQuery.list();
return JobConvertUtil.convert(objects);
});
}
项目:flow-platform
文件:JobDaoImpl.java
@Override
public List<Job> listByPath(final List<String> paths) {
return execute((Session session) -> {
final StringBuilder query = new StringBuilder(JOB_QUERY);
if (!CollectionUtil.isNullOrEmpty(paths)) {
query.append(" where job.node_path in (:paths) order by job.created_at desc ");
}
NativeQuery nativeQuery = session.createNativeQuery(query.toString())
.setResultSetMapping("MappingJobResult");
if (!CollectionUtil.isNullOrEmpty(paths)) {
nativeQuery.setParameterList("paths", paths);
}
List<Object[]> objects = nativeQuery.list();
return JobConvertUtil.convert(objects);
});
}
项目:midpoint
文件:OrgClosureManager.java
private Context onBeginTransaction(Session session) {
// table locking
if (isH2() || isOracle() || isSQLServer()) {
lockClosureTable(session);
}
// other
Context ctx = new Context();
if (isH2()) {
ctx.temporaryTableName = generateDeltaTempTableName();
String createTableQueryText = "create temporary table " + ctx.temporaryTableName + " (\n" +
" descendant_oid VARCHAR(36) NOT NULL,\n" +
" ancestor_oid VARCHAR(36) NOT NULL,\n" +
" val INTEGER NOT NULL,\n" +
" PRIMARY KEY (descendant_oid, ancestor_oid)\n" +
")";
long start = System.currentTimeMillis();
NativeQuery q = session.createNativeQuery(createTableQueryText);
q.executeUpdate();
LOGGER.trace("Temporary table {} created in {} ms", ctx.temporaryTableName, System.currentTimeMillis()-start);
}
return ctx;
}
项目:midpoint
文件:OrgClosureManager.java
public void cleanUpAfterOperation(Context closureContext, Session session) {
if (closureContext == null) {
return;
}
if (closureContext.temporaryTableName == null) {
return;
}
if (isH2()) {
// beware, this does implicit commit!
try {
session.getTransaction().begin();
NativeQuery dropQuery = session.createNativeQuery("drop table if exists " + closureContext.temporaryTableName);
dropQuery.executeUpdate();
closureContext.temporaryTableName = null;
} catch (RuntimeException ex) {
session.getTransaction().rollback();
throw ex;
}
}
}
项目:midpoint
文件:OrgClosureManager.java
private void addEdgeSimple(String oid, String parent, Session session) {
if (parent != null) {
long start = System.currentTimeMillis();
NativeQuery addToClosureQuery = session.createNativeQuery(
"insert into "+ CLOSURE_TABLE_NAME +" (descendant_oid, ancestor_oid, val) " +
"select :oid as descendant_oid, CL.ancestor_oid as ancestor_oid, CL.val as val " +
"from "+ CLOSURE_TABLE_NAME +" CL " +
"where CL.descendant_oid = :parent");
addToClosureQuery.setParameter("oid", oid);
addToClosureQuery.setParameter("parent", parent);
int count = addToClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled())
LOGGER.trace("addEdges simplified: Added {} records to closure table ({} ms).", count,
System.currentTimeMillis() - start);
}
session.flush();
session.clear();
}
项目:midpoint
文件:OrgClosureManager.java
private void handleDelete(String oid, Context context, Session session) {
List<String> livingChildren = getChildren(oid, session);
if (livingChildren.isEmpty()) {
handleDeleteLeaf(oid, session);
return;
}
// delete all edges "<child> -> OID" from the closure
removeChildrenEdges(oid, livingChildren, context, session);
if (LOGGER.isTraceEnabled()) LOGGER.trace("Deleted {} 'child' links.", livingChildren.size());
// delete all edges "OID -> <parent>" from the closure
List<String> livingParents = retainExistingOids(getParents(oid, session), session);
removeParentEdges(oid, livingParents, context, session);
if (LOGGER.isTraceEnabled()) LOGGER.trace("Deleted {} 'parent' links.", livingParents.size());
// delete (OID, OID) record
NativeQuery deleteSelfQuery = session.createNativeQuery("delete from "+ CLOSURE_TABLE_NAME +" " +
"where descendant_oid=:oid and ancestor_oid=:oid");
deleteSelfQuery.setParameter("oid", oid);
int count = deleteSelfQuery.executeUpdate();
if (LOGGER.isTraceEnabled()) LOGGER.trace("Removed {} self-record from closure table.", count);
}
项目:midpoint
文件:OrgClosureManager.java
private void initializeOracleTemporaryTable() {
Session session = baseHelper.getSessionFactory().openSession();
NativeQuery qCheck = session.createNativeQuery("select table_name from user_tables where table_name = upper('" + TEMP_DELTA_TABLE_NAME_FOR_ORACLE + "')");
if (qCheck.list().isEmpty()) {
LOGGER.info("Creating temporary table {}", TEMP_DELTA_TABLE_NAME_FOR_ORACLE);
session.beginTransaction();
NativeQuery qCreate = session.createNativeQuery("CREATE GLOBAL TEMPORARY TABLE " + TEMP_DELTA_TABLE_NAME_FOR_ORACLE +
" (descendant_oid VARCHAR2(36 CHAR), " +
" ancestor_oid VARCHAR2(36 CHAR), " +
" val NUMBER (10, 0), " +
" PRIMARY KEY (descendant_oid, ancestor_oid)) " +
" ON COMMIT DELETE ROWS");
try {
qCreate.executeUpdate();
session.getTransaction().commit();
} catch (RuntimeException e) {
String m = "Couldn't create temporary table " + TEMP_DELTA_TABLE_NAME_FOR_ORACLE + ". Please create the table manually.";
LoggingUtils.logException(LOGGER, m, e);
throw new SystemException(m, e);
}
}
session.close();
}
项目:midpoint
文件:OrgClosureManager.java
private Context onBeginTransaction(Session session) {
// table locking
if (isH2() || isOracle() || isSQLServer()) {
lockClosureTable(session);
}
// other
Context ctx = new Context();
if (isH2()) {
ctx.temporaryTableName = generateDeltaTempTableName();
String createTableQueryText = "create temporary table " + ctx.temporaryTableName + " (\n" +
" descendant_oid VARCHAR(36) NOT NULL,\n" +
" ancestor_oid VARCHAR(36) NOT NULL,\n" +
" val INTEGER NOT NULL,\n" +
" PRIMARY KEY (descendant_oid, ancestor_oid)\n" +
")";
long start = System.currentTimeMillis();
NativeQuery q = session.createNativeQuery(createTableQueryText);
q.executeUpdate();
LOGGER.trace("Temporary table {} created in {} ms", ctx.temporaryTableName, System.currentTimeMillis()-start);
}
return ctx;
}
项目:midpoint
文件:OrgClosureManager.java
public void cleanUpAfterOperation(Context closureContext, Session session) {
if (closureContext == null) {
return;
}
if (closureContext.temporaryTableName == null) {
return;
}
if (isH2()) {
// beware, this does implicit commit!
try {
session.getTransaction().begin();
NativeQuery dropQuery = session.createNativeQuery("drop table if exists " + closureContext.temporaryTableName);
dropQuery.executeUpdate();
closureContext.temporaryTableName = null;
} catch (RuntimeException ex) {
session.getTransaction().rollback();
throw ex;
}
}
}
项目:midpoint
文件:OrgClosureManager.java
private void addEdgeSimple(String oid, String parent, Session session) {
if (parent != null) {
long start = System.currentTimeMillis();
NativeQuery addToClosureQuery = session.createNativeQuery(
"insert into "+ CLOSURE_TABLE_NAME +" (descendant_oid, ancestor_oid, val) " +
"select :oid as descendant_oid, CL.ancestor_oid as ancestor_oid, CL.val as val " +
"from "+ CLOSURE_TABLE_NAME +" CL " +
"where CL.descendant_oid = :parent");
addToClosureQuery.setParameter("oid", oid);
addToClosureQuery.setParameter("parent", parent);
int count = addToClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled())
LOGGER.trace("addEdges simplified: Added {} records to closure table ({} ms).", count,
System.currentTimeMillis() - start);
}
session.flush();
session.clear();
}
项目:midpoint
文件:OrgClosureManager.java
private void handleDelete(String oid, Context context, Session session) {
List<String> livingChildren = getChildren(oid, session);
if (livingChildren.isEmpty()) {
handleDeleteLeaf(oid, session);
return;
}
// delete all edges "<child> -> OID" from the closure
removeChildrenEdges(oid, livingChildren, context, session);
if (LOGGER.isTraceEnabled()) LOGGER.trace("Deleted {} 'child' links.", livingChildren.size());
// delete all edges "OID -> <parent>" from the closure
List<String> livingParents = retainExistingOids(getParents(oid, session), session);
removeParentEdges(oid, livingParents, context, session);
if (LOGGER.isTraceEnabled()) LOGGER.trace("Deleted {} 'parent' links.", livingParents.size());
// delete (OID, OID) record
NativeQuery deleteSelfQuery = session.createNativeQuery("delete from "+ CLOSURE_TABLE_NAME +" " +
"where descendant_oid=:oid and ancestor_oid=:oid");
deleteSelfQuery.setParameter("oid", oid);
int count = deleteSelfQuery.executeUpdate();
if (LOGGER.isTraceEnabled()) LOGGER.trace("Removed {} self-record from closure table.", count);
}
项目:midpoint
文件:OrgClosureManager.java
private void initializeOracleTemporaryTable() {
Session session = baseHelper.getSessionFactory().openSession();
NativeQuery qCheck = session.createNativeQuery("select table_name from user_tables where table_name = upper('" + TEMP_DELTA_TABLE_NAME_FOR_ORACLE + "')");
if (qCheck.list().isEmpty()) {
LOGGER.info("Creating temporary table {}", TEMP_DELTA_TABLE_NAME_FOR_ORACLE);
session.beginTransaction();
NativeQuery qCreate = session.createNativeQuery("CREATE GLOBAL TEMPORARY TABLE " + TEMP_DELTA_TABLE_NAME_FOR_ORACLE +
" (descendant_oid VARCHAR2(36 CHAR), " +
" ancestor_oid VARCHAR2(36 CHAR), " +
" val NUMBER (10, 0), " +
" PRIMARY KEY (descendant_oid, ancestor_oid)) " +
" ON COMMIT DELETE ROWS");
try {
qCreate.executeUpdate();
session.getTransaction().commit();
} catch (RuntimeException e) {
String m = "Couldn't create temporary table " + TEMP_DELTA_TABLE_NAME_FOR_ORACLE + ". Please create the table manually.";
LoggingUtils.logException(LOGGER, m, e);
throw new SystemException(m, e);
}
}
session.close();
}
项目:flow-platform
文件:JobDaoImpl.java
@Override
public List<Job> list() {
return execute((Session session) -> {
NativeQuery nativeQuery = session.createNativeQuery(JOB_QUERY).setResultSetMapping("MappingJobResult");
List<Object[]> objects = nativeQuery.list();
return JobConvertUtil.convert(objects);
});
}
项目:flow-platform
文件:JobDaoImpl.java
@Override
public List<Job> list(List<String> sessionIds, NodeStatus nodeStatus) {
return execute((Session session) -> {
NativeQuery nativeQuery = session.createNativeQuery(
JOB_QUERY + " WHERE job.session_id IN (:sessionIds) AND nr.node_status=:status")
.setParameter("sessionIds", sessionIds)
.setParameter("status", nodeStatus.getName())
.setResultSetMapping("MappingJobResult");
List<Object[]> objects = nativeQuery.list();
return JobConvertUtil.convert(objects);
});
}
项目:flow-platform
文件:JobDaoImpl.java
@Override
public Job get(BigInteger key) {
return execute((Session session) -> {
NativeQuery nativeQuery = session.createNativeQuery(JOB_QUERY + " WHERE job.id=:id")
.setParameter("id", key)
.setResultSetMapping("MappingJobResult");
Object[] objects = (Object[]) nativeQuery.uniqueResult();
return JobConvertUtil.convert(objects);
});
}
项目:flow-platform
文件:JobDaoImpl.java
@Override
public Job get(String path, Long number) {
return execute((Session session) -> {
NativeQuery nativeQuery = session.createNativeQuery(
JOB_QUERY + " WHERE job.node_path=:name AND job.build_number=:build_number")
.setParameter("name", path)
.setParameter("build_number", number)
.setResultSetMapping("MappingJobResult");
Object[] objects = (Object[]) nativeQuery.uniqueResult();
return JobConvertUtil.convert(objects);
});
}
项目:jdblender
文件:ModelsDao.java
public void link2SpareFast(long modelId, long spareId) {
try (Session s = sf.openSession()) {
NativeQuery nq = s.createNativeQuery("INSERT INTO spare_to_model (spare_id, model_id) VALUES (?, ?)");
nq.setParameter(1, spareId);
nq.setParameter(2, modelId);
Transaction tx = s.beginTransaction();
nq.executeUpdate();
tx.commit();
}
}
项目:dhis2-core
文件:HibernateGenericStore.java
/**
* Creates a SqlQuery.
*
* @param sql the sql query.
* @return a SqlQuery instance.
*/
protected final NativeQuery getSqlQuery( String sql )
{
NativeQuery query = getSession().createNativeQuery( sql );
query.setHint( HibernateUtils.HIBERNATE_CACHEABLE_HINT, cacheable );
return query;
}
项目:high-performance-java-persistence
文件:FetchEntitiesWithPaginationTest.java
@Test
public void testFetchAndPaginateUsingDenseRank() {
List<Post> _posts = doInJPA(entityManager -> {
String titlePattern = "High-Performance%";
int maxResults = 3;
List<Post> posts = entityManager.createNativeQuery(
"select * " +
"from ( " +
" select *, dense_rank() OVER (ORDER BY post_id) rank " +
" from ( " +
" select p.*, pc.* " +
" from post p " +
" left join post_comment pc on p.id = pc.post_id " +
" where p.title like :title " +
" order by p.id " +
" ) p_pc " +
") p_pc_r " +
"where p_pc_r.rank <= :rank", Post.class)
.setParameter("title", titlePattern)
.setParameter("rank", maxResults)
.unwrap( NativeQuery.class )
.addEntity( "p", Post.class )
.addEntity( "pc", PostComment.class )
.setResultTransformer( DistinctPostResultTransformer.INSTANCE )
.getResultList();
assertEquals(maxResults, posts.size());
return posts;
});
assertEquals(2, _posts.get(0).comments.size());
}
项目:midpoint
文件:ObjectUpdater.java
private <T extends ObjectType> String nonOverwriteAddObjectAttempt(PrismObject<T> object, RObject rObject,
String originalOid, Session session, OrgClosureManager.Context closureContext)
throws ObjectAlreadyExistsException, SchemaException, DtoTranslationException {
// check name uniqueness (by type)
if (StringUtils.isNotEmpty(originalOid)) {
LOGGER.trace("Checking oid uniqueness.");
//todo improve this table name bullshit
Class hqlType = ClassMapper.getHQLTypeClass(object.getCompileTimeClass());
NativeQuery query = session.createNativeQuery("select count(*) from "
+ RUtil.getTableName(hqlType, session) + " where oid=:oid");
query.setParameter("oid", object.getOid());
Number count = (Number) query.uniqueResult();
if (count != null && count.longValue() > 0) {
throw new ObjectAlreadyExistsException("Object '" + object.getCompileTimeClass().getSimpleName()
+ "' with oid '" + object.getOid() + "' already exists.");
}
}
updateFullObject(rObject, object);
LOGGER.trace("Saving object (non overwrite).");
String oid = (String) session.save(rObject);
lookupTableHelper.addLookupTableRows(session, rObject, false);
caseHelper.addCertificationCampaignCases(session, rObject, false);
if (closureManager.isEnabled()) {
Collection<ReferenceDelta> modifications = createAddParentRefDelta(object);
closureManager.updateOrgClosure(null, modifications, session, oid, object.getCompileTimeClass(),
OrgClosureManager.Operation.ADD, closureContext);
}
return oid;
}
项目:midpoint
文件:ObjectRetriever.java
public <T extends ObjectType> int countObjectsAttempt(Class<T> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, OperationResult result) {
LOGGER_PERFORMANCE.debug("> count objects {}", type.getSimpleName());
int count = 0;
Session session = null;
try {
Class<? extends RObject> hqlType = ClassMapper.getHQLTypeClass(type);
session = baseHelper.beginReadOnlyTransaction();
Number longCount;
if (query == null || query.getFilter() == null) {
if (GetOperationOptions.isDistinct(SelectorOptions.findRootOptions(options))) {
throw new UnsupportedOperationException("Distinct option is not supported here"); // TODO
}
// this is 5x faster than count with 3 inner joins, it can probably improved also for queries which
// filters uses only properties from concrete entities like RUser, RRole by improving interpreter [lazyman]
NativeQuery sqlQuery = session.createNativeQuery("SELECT COUNT(*) FROM " + RUtil.getTableName(hqlType, session));
longCount = (Number) sqlQuery.uniqueResult();
} else {
RQuery rQuery;
QueryEngine2 engine = new QueryEngine2(getConfiguration(), prismContext);
rQuery = engine.interpret(query, type, options, true, session);
longCount = (Number) rQuery.uniqueResult();
}
LOGGER.trace("Found {} objects.", longCount);
count = longCount != null ? longCount.intValue() : 0;
session.getTransaction().commit();
} catch (QueryException | RuntimeException ex) {
baseHelper.handleGeneralException(ex, session, result);
} finally {
baseHelper.cleanupSessionAndResult(session, result);
}
return count;
}
项目:midpoint
文件:OrgClosureManager.java
private int quickCheck(Session session) {
NativeQuery q = session.createNativeQuery(
"select count(m_org.oid) as problems from m_org left join m_org_closure cl " +
"on cl.descendant_oid = m_org.oid and cl.ancestor_oid = m_org.oid " +
"where cl.descendant_oid is null").addScalar("problems", IntegerType.INSTANCE);
List problemsList = q.list();
if (problemsList == null || problemsList.size() != 1) {
throw new IllegalStateException("Unexpected return value from the closure check query: " + problemsList + " (a 1-item list of Integer expected)");
}
return (int) problemsList.get(0);
}
项目:midpoint
文件:OrgClosureManager.java
private void checkForCycles(List<Edge> edges, Session session) {
String queryText = "select descendant_oid, ancestor_oid from " + CLOSURE_TABLE_NAME + " where " + getWhereClauseForCycleCheck(edges);
NativeQuery query = session.createNativeQuery(queryText)
.addScalar("descendant_oid", StringType.INSTANCE)
.addScalar("ancestor_oid", StringType.INSTANCE);
long start = System.currentTimeMillis();
List list = query.list();
LOGGER.trace("Cycles checked in {} ms, {} conflicts found", System.currentTimeMillis()-start, list.size());
if (!list.isEmpty()) {
throw new IllegalArgumentException("Modification couldn't be executed, because a cycle in org structure graph would be created. Cycle-creating edges being added: " + formatList(list));
}
}
项目:midpoint
文件:OrgClosureManager.java
private void handleDeleteLeaf(String oid, Session session) {
NativeQuery removeFromClosureQuery = session.createNativeQuery(
"delete from " + CLOSURE_TABLE_NAME + " " +
"where descendant_oid = :oid");
removeFromClosureQuery.setParameter("oid", oid);
int count = removeFromClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled()) LOGGER.trace("DeleteLeaf: Removed {} records from closure table.", count);
}
项目:midpoint
文件:OrgClosureManager.java
private void dumpOrgClosureTypeTable(Session session, String tableName) {
NativeQuery q = session.createNativeQuery("select descendant_oid, ancestor_oid, val from " + tableName)
.addScalar("descendant_oid", StringType.INSTANCE)
.addScalar("ancestor_oid", StringType.INSTANCE)
.addScalar("val", IntegerType.INSTANCE);
List<Object[]> list = q.list();
LOGGER.trace("{} ({} rows):", tableName, list.size());
for (Object[] row : list) {
LOGGER.trace(" - [d={}, a={}, val={}]", row);
}
}
项目:midpoint
文件:SqlAuditServiceImpl.java
private int selectRecordsByMaxAge(Session session, String tempTable, Date minValue, Dialect dialect) {
// fill temporary table, we don't need to join task on object on
// container, oid and id is already in task table
StringBuilder selectSB = new StringBuilder();
selectSB.append("select a.id as id from ").append(RAuditEventRecord.TABLE_NAME).append(" a");
selectSB.append(" where a.").append(RAuditEventRecord.COLUMN_TIMESTAMP).append(" < ###TIME###");
String selectString = selectSB.toString();
// batch size
RowSelection rowSelection = new RowSelection();
rowSelection.setMaxRows(CLEANUP_AUDIT_BATCH_SIZE);
LimitHandler limitHandler = dialect.getLimitHandler();
selectString = limitHandler.processSql(selectString, rowSelection);
// replace ? -> batch size, $ -> ?
// Sorry for that .... I just don't know how to write this query in HQL,
// nor I'm not sure if limiting max size in
// compound insert into ... select ... query via query.setMaxSize()
// would work - TODO write more nicely if anybody knows how)
selectString = selectString.replace("?", String.valueOf(CLEANUP_AUDIT_BATCH_SIZE));
selectString = selectString.replace("###TIME###", "?");
String queryString = "insert into " + tempTable + " " + selectString;
LOGGER.trace("Query string = {}", queryString);
NativeQuery query = session.createNativeQuery(queryString);
query.setParameter(1, new Timestamp(minValue.getTime()));
return query.executeUpdate();
}
项目:midpoint
文件:SqlAuditServiceImpl.java
private int selectRecordsByNumberToKeep(Session session, String tempTable, Integer recordsToKeep, Dialect dialect) {
Number totalAuditRecords = (Number) session.createCriteria(RAuditEventRecord.class)
.setProjection(Projections.rowCount())
.uniqueResult();
int recordsToDelete = totalAuditRecords.intValue() - recordsToKeep;
if (recordsToDelete <= 0) {
recordsToDelete = 0;
} else if (recordsToDelete > CLEANUP_AUDIT_BATCH_SIZE) {
recordsToDelete = CLEANUP_AUDIT_BATCH_SIZE;
}
LOGGER.debug("Total audit records: {}, records to keep: {} => records to delete in this batch: {}",
totalAuditRecords, recordsToKeep, recordsToDelete);
if (recordsToDelete == 0) {
return 0;
}
StringBuilder selectSB = new StringBuilder();
selectSB.append("select a.id as id from ").append(RAuditEventRecord.TABLE_NAME).append(" a");
selectSB.append(" order by a.").append(RAuditEventRecord.COLUMN_TIMESTAMP).append(" asc");
String selectString = selectSB.toString();
// batch size
RowSelection rowSelection = new RowSelection();
rowSelection.setMaxRows(recordsToDelete);
LimitHandler limitHandler = dialect.getLimitHandler();
selectString = limitHandler.processSql(selectString, rowSelection);
selectString = selectString.replace("?", String.valueOf(recordsToDelete));
String queryString = "insert into " + tempTable + " " + selectString;
LOGGER.trace("Query string = {}", queryString);
NativeQuery query = session.createNativeQuery(queryString);
return query.executeUpdate();
}
项目:midpoint
文件:ObjectUpdater.java
private <T extends ObjectType> String nonOverwriteAddObjectAttempt(PrismObject<T> object, RObject rObject,
String originalOid, Session session, OrgClosureManager.Context closureContext)
throws ObjectAlreadyExistsException, SchemaException, DtoTranslationException {
// check name uniqueness (by type)
if (StringUtils.isNotEmpty(originalOid)) {
LOGGER.trace("Checking oid uniqueness.");
//todo improve this table name bullshit
Class hqlType = ClassMapper.getHQLTypeClass(object.getCompileTimeClass());
NativeQuery query = session.createNativeQuery("select count(*) from "
+ RUtil.getTableName(hqlType, session) + " where oid=:oid");
query.setParameter("oid", object.getOid());
Number count = (Number) query.uniqueResult();
if (count != null && count.longValue() > 0) {
throw new ObjectAlreadyExistsException("Object '" + object.getCompileTimeClass().getSimpleName()
+ "' with oid '" + object.getOid() + "' already exists.");
}
}
updateFullObject(rObject, object);
LOGGER.trace("Saving object (non overwrite).");
String oid = (String) session.save(rObject);
lookupTableHelper.addLookupTableRows(session, rObject, false);
caseHelper.addCertificationCampaignCases(session, rObject, false);
if (closureManager.isEnabled()) {
Collection<ReferenceDelta> modifications = createAddParentRefDelta(object);
closureManager.updateOrgClosure(null, modifications, session, oid, object.getCompileTimeClass(),
OrgClosureManager.Operation.ADD, closureContext);
}
return oid;
}
项目:midpoint
文件:ObjectRetriever.java
public <T extends ObjectType> int countObjectsAttempt(Class<T> type, ObjectQuery query,
Collection<SelectorOptions<GetOperationOptions>> options, OperationResult result) {
LOGGER_PERFORMANCE.debug("> count objects {}", type.getSimpleName());
int count = 0;
Session session = null;
try {
Class<? extends RObject> hqlType = ClassMapper.getHQLTypeClass(type);
session = baseHelper.beginReadOnlyTransaction();
Number longCount;
if (query == null || query.getFilter() == null) {
if (GetOperationOptions.isDistinct(SelectorOptions.findRootOptions(options))) {
throw new UnsupportedOperationException("Distinct option is not supported here"); // TODO
}
// this is 5x faster than count with 3 inner joins, it can probably improved also for queries which
// filters uses only properties from concrete entities like RUser, RRole by improving interpreter [lazyman]
NativeQuery sqlQuery = session.createNativeQuery("SELECT COUNT(*) FROM " + RUtil.getTableName(hqlType, session));
longCount = (Number) sqlQuery.uniqueResult();
} else {
RQuery rQuery;
QueryEngine2 engine = new QueryEngine2(getConfiguration(), prismContext);
rQuery = engine.interpret(query, type, options, true, session);
longCount = (Number) rQuery.uniqueResult();
}
LOGGER.trace("Found {} objects.", longCount);
count = longCount != null ? longCount.intValue() : 0;
session.getTransaction().commit();
} catch (QueryException | RuntimeException ex) {
baseHelper.handleGeneralException(ex, session, result);
} finally {
baseHelper.cleanupSessionAndResult(session, result);
}
return count;
}
项目:midpoint
文件:OrgClosureManager.java
private int quickCheck(Session session) {
NativeQuery q = session.createNativeQuery(
"select count(m_org.oid) as problems from m_org left join m_org_closure cl " +
"on cl.descendant_oid = m_org.oid and cl.ancestor_oid = m_org.oid " +
"where cl.descendant_oid is null").addScalar("problems", IntegerType.INSTANCE);
List problemsList = q.list();
if (problemsList == null || problemsList.size() != 1) {
throw new IllegalStateException("Unexpected return value from the closure check query: " + problemsList + " (a 1-item list of Integer expected)");
}
return (int) problemsList.get(0);
}
项目:midpoint
文件:OrgClosureManager.java
private void checkForCycles(List<Edge> edges, Session session) {
String queryText = "select descendant_oid, ancestor_oid from " + CLOSURE_TABLE_NAME + " where " + getWhereClauseForCycleCheck(edges);
NativeQuery query = session.createNativeQuery(queryText)
.addScalar("descendant_oid", StringType.INSTANCE)
.addScalar("ancestor_oid", StringType.INSTANCE);
long start = System.currentTimeMillis();
List list = query.list();
LOGGER.trace("Cycles checked in {} ms, {} conflicts found", System.currentTimeMillis()-start, list.size());
if (!list.isEmpty()) {
throw new IllegalArgumentException("Modification couldn't be executed, because a cycle in org structure graph would be created. Cycle-creating edges being added: " + formatList(list));
}
}
项目:midpoint
文件:OrgClosureManager.java
private void handleDeleteLeaf(String oid, Session session) {
NativeQuery removeFromClosureQuery = session.createNativeQuery(
"delete from " + CLOSURE_TABLE_NAME + " " +
"where descendant_oid = :oid");
removeFromClosureQuery.setParameter("oid", oid);
int count = removeFromClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled()) LOGGER.trace("DeleteLeaf: Removed {} records from closure table.", count);
}
项目:midpoint
文件:OrgClosureManager.java
private void dumpOrgClosureTypeTable(Session session, String tableName) {
NativeQuery q = session.createNativeQuery("select descendant_oid, ancestor_oid, val from " + tableName)
.addScalar("descendant_oid", StringType.INSTANCE)
.addScalar("ancestor_oid", StringType.INSTANCE)
.addScalar("val", IntegerType.INSTANCE);
List<Object[]> list = q.list();
LOGGER.trace("{} ({} rows):", tableName, list.size());
for (Object[] row : list) {
LOGGER.trace(" - [d={}, a={}, val={}]", row);
}
}
项目:midpoint
文件:SqlAuditServiceImpl.java
private int selectRecordsByMaxAge(Session session, String tempTable, Date minValue, Dialect dialect) {
// fill temporary table, we don't need to join task on object on
// container, oid and id is already in task table
StringBuilder selectSB = new StringBuilder();
selectSB.append("select a.id as id from ").append(RAuditEventRecord.TABLE_NAME).append(" a");
selectSB.append(" where a.").append(RAuditEventRecord.COLUMN_TIMESTAMP).append(" < ###TIME###");
String selectString = selectSB.toString();
// batch size
RowSelection rowSelection = new RowSelection();
rowSelection.setMaxRows(CLEANUP_AUDIT_BATCH_SIZE);
LimitHandler limitHandler = dialect.getLimitHandler();
selectString = limitHandler.processSql(selectString, rowSelection);
// replace ? -> batch size, $ -> ?
// Sorry for that .... I just don't know how to write this query in HQL,
// nor I'm not sure if limiting max size in
// compound insert into ... select ... query via query.setMaxSize()
// would work - TODO write more nicely if anybody knows how)
selectString = selectString.replace("?", String.valueOf(CLEANUP_AUDIT_BATCH_SIZE));
selectString = selectString.replace("###TIME###", "?");
String queryString = "insert into " + tempTable + " " + selectString;
LOGGER.trace("Query string = {}", queryString);
NativeQuery query = session.createNativeQuery(queryString);
query.setParameter(1, new Timestamp(minValue.getTime()));
return query.executeUpdate();
}
项目:midpoint
文件:SqlAuditServiceImpl.java
private int selectRecordsByNumberToKeep(Session session, String tempTable, Integer recordsToKeep, Dialect dialect) {
Number totalAuditRecords = (Number) session.createCriteria(RAuditEventRecord.class)
.setProjection(Projections.rowCount())
.uniqueResult();
int recordsToDelete = totalAuditRecords.intValue() - recordsToKeep;
if (recordsToDelete <= 0) {
recordsToDelete = 0;
} else if (recordsToDelete > CLEANUP_AUDIT_BATCH_SIZE) {
recordsToDelete = CLEANUP_AUDIT_BATCH_SIZE;
}
LOGGER.debug("Total audit records: {}, records to keep: {} => records to delete in this batch: {}",
totalAuditRecords, recordsToKeep, recordsToDelete);
if (recordsToDelete == 0) {
return 0;
}
StringBuilder selectSB = new StringBuilder();
selectSB.append("select a.id as id from ").append(RAuditEventRecord.TABLE_NAME).append(" a");
selectSB.append(" order by a.").append(RAuditEventRecord.COLUMN_TIMESTAMP).append(" asc");
String selectString = selectSB.toString();
// batch size
RowSelection rowSelection = new RowSelection();
rowSelection.setMaxRows(recordsToDelete);
LimitHandler limitHandler = dialect.getLimitHandler();
selectString = limitHandler.processSql(selectString, rowSelection);
selectString = selectString.replace("?", String.valueOf(recordsToDelete));
String queryString = "insert into " + tempTable + " " + selectString;
LOGGER.trace("Query string = {}", queryString);
NativeQuery query = session.createNativeQuery(queryString);
return query.executeUpdate();
}
项目:high-performance-java-persistence
文件:PostCommentScoreStoredProcedureTest.java
protected List<PostCommentScore> postCommentScoresCTEJoin(Long postId, int rank) {
return doInJPA(entityManager -> {
List<PostCommentScore> postCommentScores = entityManager.createNativeQuery(
"SELECT id, parent_id, review, created_on, score " +
"FROM ( " +
" SELECT " +
" id, parent_id, review, created_on, score, " +
" dense_rank() OVER (ORDER BY total_score DESC) rank " +
" FROM ( " +
" SELECT " +
" id, parent_id, review, created_on, score, " +
" SUM(score) OVER (PARTITION BY root_id) total_score " +
" FROM (" +
" WITH RECURSIVE post_comment_score(id, root_id, post_id, " +
" parent_id, review, created_on, score) AS (" +
" SELECT " +
" id, id, post_id, parent_id, review, created_on, score" +
" FROM post_comment " +
" WHERE post_id = :postId AND parent_id IS NULL " +
" UNION ALL " +
" SELECT pc.id, pcs.root_id, pc.post_id, pc.parent_id, " +
" pc.review, pc.created_on, pc.score " +
" FROM post_comment pc " +
" INNER JOIN post_comment_score pcs " +
" ON pc.parent_id = pcs.id " +
" WHERE pc.parent_id = pcs.id " +
" ) " +
" SELECT id, parent_id, root_id, review, created_on, score " +
" FROM post_comment_score " +
" ) score_by_comment " +
" ) score_total " +
" ORDER BY total_score DESC, id ASC " +
") total_score_group " +
"WHERE rank <= :rank", "PostCommentScore").unwrap(NativeQuery.class)
.setParameter("postId", postId)
.setParameter("rank", rank)
.setResultTransformer(new PostCommentScoreResultTransformer())
.list();
return postCommentScores;
});
}
项目:midpoint
文件:CertificationCaseHelper.java
protected List<Long> addOrDeleteCases(Session session, String campaignOid, Collection<? extends ItemDelta> modifications) throws SchemaException, DtoTranslationException {
final ItemPath casePath = new ItemPath(AccessCertificationCampaignType.F_CASE);
boolean replacePresent = false;
List<Long> affectedIds = new ArrayList<>();
for (ItemDelta delta : modifications) {
ItemPath deltaPath = delta.getPath();
if (!casePath.isSubPathOrEquivalent(deltaPath)) {
throw new IllegalStateException("Wrong campaign delta sneaked into updateCampaignCases: class=" + delta.getClass() + ", path=" + deltaPath);
}
if (deltaPath.size() == 1) {
if (delta.getValuesToDelete() != null) {
// todo do 'bulk' delete like delete from ... where oid=? and id in (...)
for (PrismContainerValue value : (Collection<PrismContainerValue>) delta.getValuesToDelete()) {
Long id = value.getId();
if (id == null) {
throw new SchemaException("Couldn't delete certification case with null id");
}
affectedIds.add(id);
// TODO couldn't this cascading be done by hibernate itself?
Integer integerCaseId = RUtil.toInteger(id);
// NativeQuery deleteCaseReferences = session.createNativeQuery("delete from " + RCertCaseReference.TABLE +
// " where owner_owner_oid=:oid and owner_id=:id");
// deleteCaseReferences.setParameter("oid", campaignOid);
// deleteCaseReferences.setParameter("id", integerCaseId);
// deleteCaseReferences.executeUpdate();
NativeQuery deleteWorkItemReferences = session.createNativeQuery("delete from " + RCertWorkItemReference.TABLE +
" where owner_owner_owner_oid=:oid and owner_owner_id=:id");
deleteWorkItemReferences.setParameter("oid", campaignOid);
deleteWorkItemReferences.setParameter("id", integerCaseId);
deleteWorkItemReferences.executeUpdate();
NativeQuery deleteCaseWorkItems = session.createNativeQuery("delete from " + RAccessCertificationWorkItem.TABLE +
" where owner_owner_oid=:oid and owner_id=:id");
deleteCaseWorkItems.setParameter("oid", campaignOid);
deleteCaseWorkItems.setParameter("id", integerCaseId);
deleteCaseWorkItems.executeUpdate();
Query deleteCase = session.getNamedQuery("delete.campaignCase");
deleteCase.setParameter("oid", campaignOid);
deleteCase.setParameter("id", integerCaseId);
deleteCase.executeUpdate();
}
}
// TODO generated IDs might conflict with client-provided ones
// also, client-provided IDs might conflict with those that are already in the database
// So it's safest not to provide any IDs by the client
if (delta.getValuesToAdd() != null) {
int currentId = generalHelper.findLastIdInRepo(session, campaignOid, "get.campaignCaseLastId") + 1;
addCertificationCampaignCases(session, campaignOid, delta.getValuesToAdd(), currentId, affectedIds);
}
if (delta.getValuesToReplace() != null) {
deleteCertificationCampaignCases(session, campaignOid);
addCertificationCampaignCases(session, campaignOid, delta.getValuesToReplace(), 1, affectedIds);
replacePresent = true;
}
}
}
return replacePresent ? null : affectedIds;
}
项目:midpoint
文件:OrgClosureManager.java
private void removeIndependentEdgesInternal(List<Edge> edges, Context context, Session session) {
String deltaTempTableName = computeDeltaTable(edges, context, session);
try {
int count;
String deleteFromClosureQueryText, updateInClosureQueryText;
if (isH2()) {
// delete with join is not supported by H2
// and the "postgresql/oracle version" does not work for some reasons
deleteFromClosureQueryText = "delete from " + CLOSURE_TABLE_NAME + " cl " +
"where exists (" +
"select 0 from " + deltaTempTableName + " delta " +
"where cl.descendant_oid = delta.descendant_oid and cl.ancestor_oid = delta.ancestor_oid and cl.val = delta.val)";
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME + " " +
"set val = val - (select val from " + deltaTempTableName + " td " +
"where td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid) " +
"where (descendant_oid, ancestor_oid) in (select (descendant_oid, ancestor_oid) from " + deltaTempTableName + ")";
} else if (isPostgreSQL() || isOracle()) {
deleteFromClosureQueryText = "delete from " + CLOSURE_TABLE_NAME + " " +
"where (descendant_oid, ancestor_oid, val) in " +
"(select descendant_oid, ancestor_oid, val from " + deltaTempTableName + ")";
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME + " " +
"set val = val - (select val from " + deltaTempTableName + " td " +
"where td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid) " +
"where (descendant_oid, ancestor_oid) in (select descendant_oid, ancestor_oid from " + deltaTempTableName + ")";
} else if (isSQLServer()) {
// delete is the same as for MySQL
deleteFromClosureQueryText = "delete " + CLOSURE_TABLE_NAME + " from " + CLOSURE_TABLE_NAME + " " +
"inner join " + deltaTempTableName + " td on " +
"td.descendant_oid = "+ CLOSURE_TABLE_NAME +".descendant_oid and td.ancestor_oid = "+ CLOSURE_TABLE_NAME +".ancestor_oid and "+
"td.val = "+ CLOSURE_TABLE_NAME +".val";
// update is also done via inner join (as in MySQL), but using slightly different syntax
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME + " " +
"set "+ CLOSURE_TABLE_NAME +".val = "+ CLOSURE_TABLE_NAME +".val - td.val " +
"from "+ CLOSURE_TABLE_NAME + " " +
"inner join " + deltaTempTableName + " td " +
"on td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and " +
"td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid";
} else if (isMySqlCompatible()) {
// http://stackoverflow.com/questions/652770/delete-with-join-in-mysql
// TODO consider this for other databases as well
deleteFromClosureQueryText = "delete " + CLOSURE_TABLE_NAME + " from " + CLOSURE_TABLE_NAME + " " +
"inner join " + deltaTempTableName + " td on " +
"td.descendant_oid = "+ CLOSURE_TABLE_NAME +".descendant_oid and td.ancestor_oid = "+ CLOSURE_TABLE_NAME +".ancestor_oid and "+
"td.val = "+ CLOSURE_TABLE_NAME +".val";
// it is not possible to use temporary table twice in a query
// TODO consider using this in postgresql as well...
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME +
" join " + deltaTempTableName + " td " +
"on td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid " +
"set "+ CLOSURE_TABLE_NAME +".val = "+ CLOSURE_TABLE_NAME +".val - td.val";
} else {
throw new UnsupportedOperationException("Org. closure manager - unsupported database operation");
}
long startDelete = System.currentTimeMillis();
NativeQuery deleteFromClosureQuery = session.createNativeQuery(deleteFromClosureQueryText);
count = deleteFromClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled())
LOGGER.trace("Deleted {} records from closure table in {} ms", count, System.currentTimeMillis() - startDelete);
if (DUMP_TABLES) dumpOrgClosureTypeTable(session, CLOSURE_TABLE_NAME);
long startUpdate = System.currentTimeMillis();
NativeQuery updateInClosureQuery = session.createNativeQuery(updateInClosureQueryText);
count = updateInClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled())
LOGGER.trace("Updated {} records in closure table in {} ms", count, System.currentTimeMillis() - startUpdate);
if (DUMP_TABLES) dumpOrgClosureTypeTable(session, CLOSURE_TABLE_NAME);
} finally {
dropDeltaTableIfNecessary(session, deltaTempTableName);
}
}
项目:midpoint
文件:CertificationCaseHelper.java
protected List<Long> addOrDeleteCases(Session session, String campaignOid, Collection<? extends ItemDelta> modifications) throws SchemaException, DtoTranslationException {
final ItemPath casePath = new ItemPath(AccessCertificationCampaignType.F_CASE);
boolean replacePresent = false;
List<Long> affectedIds = new ArrayList<>();
for (ItemDelta delta : modifications) {
ItemPath deltaPath = delta.getPath();
if (!casePath.isSubPathOrEquivalent(deltaPath)) {
throw new IllegalStateException("Wrong campaign delta sneaked into updateCampaignCases: class=" + delta.getClass() + ", path=" + deltaPath);
}
if (deltaPath.size() == 1) {
if (delta.getValuesToDelete() != null) {
// todo do 'bulk' delete like delete from ... where oid=? and id in (...)
for (PrismContainerValue value : (Collection<PrismContainerValue>) delta.getValuesToDelete()) {
Long id = value.getId();
if (id == null) {
throw new SchemaException("Couldn't delete certification case with null id");
}
affectedIds.add(id);
// TODO couldn't this cascading be done by hibernate itself?
Integer integerCaseId = RUtil.toInteger(id);
// NativeQuery deleteCaseReferences = session.createNativeQuery("delete from " + RCertCaseReference.TABLE +
// " where owner_owner_oid=:oid and owner_id=:id");
// deleteCaseReferences.setParameter("oid", campaignOid);
// deleteCaseReferences.setParameter("id", integerCaseId);
// deleteCaseReferences.executeUpdate();
NativeQuery deleteWorkItemReferences = session.createNativeQuery("delete from " + RCertWorkItemReference.TABLE +
" where owner_owner_owner_oid=:oid and owner_owner_id=:id");
deleteWorkItemReferences.setParameter("oid", campaignOid);
deleteWorkItemReferences.setParameter("id", integerCaseId);
deleteWorkItemReferences.executeUpdate();
NativeQuery deleteCaseWorkItems = session.createNativeQuery("delete from " + RAccessCertificationWorkItem.TABLE +
" where owner_owner_oid=:oid and owner_id=:id");
deleteCaseWorkItems.setParameter("oid", campaignOid);
deleteCaseWorkItems.setParameter("id", integerCaseId);
deleteCaseWorkItems.executeUpdate();
Query deleteCase = session.getNamedQuery("delete.campaignCase");
deleteCase.setParameter("oid", campaignOid);
deleteCase.setParameter("id", integerCaseId);
deleteCase.executeUpdate();
}
}
// TODO generated IDs might conflict with client-provided ones
// also, client-provided IDs might conflict with those that are already in the database
// So it's safest not to provide any IDs by the client
if (delta.getValuesToAdd() != null) {
int currentId = generalHelper.findLastIdInRepo(session, campaignOid, "get.campaignCaseLastId") + 1;
addCertificationCampaignCases(session, campaignOid, delta.getValuesToAdd(), currentId, affectedIds);
}
if (delta.getValuesToReplace() != null) {
deleteCertificationCampaignCases(session, campaignOid);
addCertificationCampaignCases(session, campaignOid, delta.getValuesToReplace(), 1, affectedIds);
replacePresent = true;
}
}
}
return replacePresent ? null : affectedIds;
}
项目:midpoint
文件:OrgClosureManager.java
private void removeIndependentEdgesInternal(List<Edge> edges, Context context, Session session) {
String deltaTempTableName = computeDeltaTable(edges, context, session);
try {
int count;
String deleteFromClosureQueryText, updateInClosureQueryText;
if (isH2()) {
// delete with join is not supported by H2
// and the "postgresql/oracle version" does not work for some reasons
deleteFromClosureQueryText = "delete from " + CLOSURE_TABLE_NAME + " cl " +
"where exists (" +
"select 0 from " + deltaTempTableName + " delta " +
"where cl.descendant_oid = delta.descendant_oid and cl.ancestor_oid = delta.ancestor_oid and cl.val = delta.val)";
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME + " " +
"set val = val - (select val from " + deltaTempTableName + " td " +
"where td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid) " +
"where (descendant_oid, ancestor_oid) in (select (descendant_oid, ancestor_oid) from " + deltaTempTableName + ")";
} else if (isPostgreSQL() || isOracle()) {
deleteFromClosureQueryText = "delete from " + CLOSURE_TABLE_NAME + " " +
"where (descendant_oid, ancestor_oid, val) in " +
"(select descendant_oid, ancestor_oid, val from " + deltaTempTableName + ")";
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME + " " +
"set val = val - (select val from " + deltaTempTableName + " td " +
"where td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid) " +
"where (descendant_oid, ancestor_oid) in (select descendant_oid, ancestor_oid from " + deltaTempTableName + ")";
} else if (isSQLServer()) {
// delete is the same as for MySQL
deleteFromClosureQueryText = "delete " + CLOSURE_TABLE_NAME + " from " + CLOSURE_TABLE_NAME + " " +
"inner join " + deltaTempTableName + " td on " +
"td.descendant_oid = "+ CLOSURE_TABLE_NAME +".descendant_oid and td.ancestor_oid = "+ CLOSURE_TABLE_NAME +".ancestor_oid and "+
"td.val = "+ CLOSURE_TABLE_NAME +".val";
// update is also done via inner join (as in MySQL), but using slightly different syntax
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME + " " +
"set "+ CLOSURE_TABLE_NAME +".val = "+ CLOSURE_TABLE_NAME +".val - td.val " +
"from "+ CLOSURE_TABLE_NAME + " " +
"inner join " + deltaTempTableName + " td " +
"on td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and " +
"td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid";
} else if (isMySqlCompatible()) {
// http://stackoverflow.com/questions/652770/delete-with-join-in-mysql
// TODO consider this for other databases as well
deleteFromClosureQueryText = "delete " + CLOSURE_TABLE_NAME + " from " + CLOSURE_TABLE_NAME + " " +
"inner join " + deltaTempTableName + " td on " +
"td.descendant_oid = "+ CLOSURE_TABLE_NAME +".descendant_oid and td.ancestor_oid = "+ CLOSURE_TABLE_NAME +".ancestor_oid and "+
"td.val = "+ CLOSURE_TABLE_NAME +".val";
// it is not possible to use temporary table twice in a query
// TODO consider using this in postgresql as well...
updateInClosureQueryText = "update " + CLOSURE_TABLE_NAME +
" join " + deltaTempTableName + " td " +
"on td.descendant_oid=" + CLOSURE_TABLE_NAME + ".descendant_oid and td.ancestor_oid=" + CLOSURE_TABLE_NAME + ".ancestor_oid " +
"set "+ CLOSURE_TABLE_NAME +".val = "+ CLOSURE_TABLE_NAME +".val - td.val";
} else {
throw new UnsupportedOperationException("Org. closure manager - unsupported database operation");
}
long startDelete = System.currentTimeMillis();
NativeQuery deleteFromClosureQuery = session.createNativeQuery(deleteFromClosureQueryText);
count = deleteFromClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled())
LOGGER.trace("Deleted {} records from closure table in {} ms", count, System.currentTimeMillis() - startDelete);
if (DUMP_TABLES) dumpOrgClosureTypeTable(session, CLOSURE_TABLE_NAME);
long startUpdate = System.currentTimeMillis();
NativeQuery updateInClosureQuery = session.createNativeQuery(updateInClosureQueryText);
count = updateInClosureQuery.executeUpdate();
if (LOGGER.isTraceEnabled())
LOGGER.trace("Updated {} records in closure table in {} ms", count, System.currentTimeMillis() - startUpdate);
if (DUMP_TABLES) dumpOrgClosureTypeTable(session, CLOSURE_TABLE_NAME);
} finally {
dropDeltaTableIfNecessary(session, deltaTempTableName);
}
}