Java 类org.hibernate.hql.internal.ast.tree.UpdateStatement 实例源码
项目:lams
文件:TableBasedUpdateHandlerImpl.java
public TableBasedUpdateHandlerImpl(
SessionFactoryImplementor factory,
HqlSqlWalker walker,
String catalog,
String schema) {
super( factory, walker, catalog, schema );
UpdateStatement updateStatement = ( UpdateStatement ) walker.getAST();
FromElement fromElement = updateStatement.getFromClause().getFromElement();
this.targetedPersister = fromElement.getQueryable();
final String bulkTargetAlias = fromElement.getTableAlias();
final ProcessedWhereClause processedWhereClause = processWhereClause( updateStatement.getWhereClause() );
this.idSelectParameterSpecifications = processedWhereClause.getIdSelectParameterSpecifications();
this.idInsertSelect = generateIdInsertSelect( targetedPersister, bulkTargetAlias, processedWhereClause );
log.tracev( "Generated ID-INSERT-SELECT SQL (multi-table update) : {0}", idInsertSelect );
String[] tableNames = targetedPersister.getConstraintOrderedTableNameClosure();
String[][] columnNames = targetedPersister.getContraintOrderedTableKeyColumnClosure();
String idSubselect = generateIdSubselect( targetedPersister );
updates = new String[tableNames.length];
assignmentParameterSpecifications = new ParameterSpecification[tableNames.length][];
for ( int tableIndex = 0; tableIndex < tableNames.length; tableIndex++ ) {
boolean affected = false;
final List<ParameterSpecification> parameterList = new ArrayList<ParameterSpecification>();
final Update update = new Update( factory().getDialect() )
.setTableName( tableNames[tableIndex] )
.setWhere( "(" + StringHelper.join( ", ", columnNames[tableIndex] ) + ") IN (" + idSubselect + ")" );
if ( factory().getSettings().isCommentsEnabled() ) {
update.setComment( "bulk update" );
}
final List<AssignmentSpecification> assignmentSpecifications = walker.getAssignmentSpecifications();
for ( AssignmentSpecification assignmentSpecification : assignmentSpecifications ) {
if ( assignmentSpecification.affectsTable( tableNames[tableIndex] ) ) {
affected = true;
update.appendAssignmentFragment( assignmentSpecification.getSqlAssignmentFragment() );
if ( assignmentSpecification.getParameters() != null ) {
for ( int paramIndex = 0; paramIndex < assignmentSpecification.getParameters().length; paramIndex++ ) {
parameterList.add( assignmentSpecification.getParameters()[paramIndex] );
}
}
}
}
if ( affected ) {
updates[tableIndex] = update.toStatementString();
assignmentParameterSpecifications[tableIndex] = parameterList.toArray( new ParameterSpecification[parameterList.size()] );
}
}
}
项目:lams
文件:HqlSqlWalker.java
@Override
protected void postProcessUpdate(AST update) throws SemanticException {
UpdateStatement updateStatement = (UpdateStatement) update;
postProcessDML( updateStatement );
}
项目:lams
文件:HqlSqlWalker.java
@Override
protected void prepareVersioned(AST updateNode, AST versioned) throws SemanticException {
UpdateStatement updateStatement = (UpdateStatement) updateNode;
FromClause fromClause = updateStatement.getFromClause();
if ( versioned != null ) {
// Make sure that the persister is versioned
Queryable persister = fromClause.getFromElement().getQueryable();
if ( !persister.isVersioned() ) {
throw new SemanticException( "increment option specified for update of non-versioned entity" );
}
VersionType versionType = persister.getVersionType();
if ( versionType instanceof UserVersionType ) {
throw new SemanticException( "user-defined version types not supported for increment option" );
}
AST eq = getASTFactory().create( HqlSqlTokenTypes.EQ, "=" );
AST versionPropertyNode = generateVersionPropertyNode( persister );
eq.setFirstChild( versionPropertyNode );
AST versionIncrementNode = null;
if ( isTimestampBasedVersion( versionType ) ) {
versionIncrementNode = getASTFactory().create( HqlSqlTokenTypes.PARAM, "?" );
ParameterSpecification paramSpec = new VersionTypeSeedParameterSpecification( versionType );
( (ParameterNode) versionIncrementNode ).setHqlParameterSpecification( paramSpec );
parameters.add( 0, paramSpec );
}
else {
// Not possible to simply re-use the versionPropertyNode here as it causes
// OOM errors due to circularity :(
versionIncrementNode = getASTFactory().create( HqlSqlTokenTypes.PLUS, "+" );
versionIncrementNode.setFirstChild( generateVersionPropertyNode( persister ) );
versionIncrementNode.addChild( getASTFactory().create( HqlSqlTokenTypes.IDENT, "1" ) );
}
eq.addChild( versionIncrementNode );
evaluateAssignment( eq, persister, 0 );
AST setClause = updateStatement.getSetClause();
AST currentFirstSetElement = setClause.getFirstChild();
setClause.setFirstChild( eq );
eq.setNextSibling( currentFirstSetElement );
}
}
项目:cte-multi-table-bulk-id-stategy
文件:CTEBasedUpdateHandlerImpl.java
public CTEBasedUpdateHandlerImpl(SessionFactoryImplementor factory,
HqlSqlWalker walker, String catalog, String schema) {
super(factory, walker, catalog, schema);
UpdateStatement updateStatement = (UpdateStatement) walker.getAST();
FromElement fromElement = updateStatement.getFromClause()
.getFromElement();
this.targetedPersister = fromElement.getQueryable();
final ProcessedWhereClause processedWhereClause = processWhereClause(updateStatement
.getWhereClause());
this.idSelectParameterSpecifications = processedWhereClause
.getIdSelectParameterSpecifications();
final String bulkTargetAlias = fromElement.getTableAlias();
this.idSelect = generateIdSelect(targetedPersister,
bulkTargetAlias, processedWhereClause);
String[] tableNames = targetedPersister
.getConstraintOrderedTableNameClosure();
String[][] columnNames = targetedPersister
.getContraintOrderedTableKeyColumnClosure();
String idSubselect = generateIdSubselect( targetedPersister);
updates = new String[tableNames.length];
assignmentParameterSpecifications = new ParameterSpecification[tableNames.length][];
for (int tableIndex = 0; tableIndex < tableNames.length; tableIndex++) {
boolean affected = false;
final List<ParameterSpecification> parameterList = new ArrayList<ParameterSpecification>();
final Update update = new Update( factory().getDialect())
.setTableName(tableNames[tableIndex]).setWhere(
"("
+ StringHelper.join( ", ",
columnNames[tableIndex]) + ") IN ("
+ idSubselect + ")");
if (factory().getSettings().isCommentsEnabled()) {
update.setComment("bulk update");
}
final List<AssignmentSpecification> assignmentSpecifications = walker
.getAssignmentSpecifications();
for (AssignmentSpecification assignmentSpecification : assignmentSpecifications) {
if (assignmentSpecification
.affectsTable(tableNames[tableIndex])) {
affected = true;
update.appendAssignmentFragment(assignmentSpecification
.getSqlAssignmentFragment());
if (assignmentSpecification.getParameters() != null) {
for (int paramIndex = 0; paramIndex < assignmentSpecification
.getParameters().length; paramIndex++) {
parameterList.add(assignmentSpecification
.getParameters()[paramIndex]);
}
}
}
}
if (affected) {
updates[tableIndex] = update.toStatementString();
assignmentParameterSpecifications[tableIndex] = parameterList
.toArray(new ParameterSpecification[parameterList
.size()]);
}
}
}
项目:cte-multi-table-bulk-id-stategy
文件:CTEBasedUpdateHandlerImpl.java
public CTEBasedUpdateHandlerImpl(SessionFactoryImplementor factory,
HqlSqlWalker walker, String catalog, String schema) {
super(factory, walker, catalog, schema);
UpdateStatement updateStatement = (UpdateStatement) walker.getAST();
FromElement fromElement = updateStatement.getFromClause()
.getFromElement();
this.targetedPersister = fromElement.getQueryable();
final ProcessedWhereClause processedWhereClause = processWhereClause(updateStatement
.getWhereClause());
this.idSelectParameterSpecifications = processedWhereClause
.getIdSelectParameterSpecifications();
final String bulkTargetAlias = fromElement.getTableAlias();
this.idSelect = generateIdSelect(targetedPersister,
bulkTargetAlias, processedWhereClause);
String[] tableNames = targetedPersister
.getConstraintOrderedTableNameClosure();
String[][] columnNames = targetedPersister
.getContraintOrderedTableKeyColumnClosure();
String idSubselect = generateIdSubselect(targetedPersister);
updates = new String[tableNames.length];
assignmentParameterSpecifications = new ParameterSpecification[tableNames.length][];
for (int tableIndex = 0; tableIndex < tableNames.length; tableIndex++) {
boolean affected = false;
final List<ParameterSpecification> parameterList = new ArrayList<ParameterSpecification>();
final Update update = new Update(factory().getDialect())
.setTableName(tableNames[tableIndex]).setWhere(
"("
+ StringHelper.join(", ",
columnNames[tableIndex]) + ") IN ("
+ idSubselect + ")");
if (factory().getSettings().isCommentsEnabled()) {
update.setComment("bulk update");
}
final List<AssignmentSpecification> assignmentSpecifications = walker
.getAssignmentSpecifications();
for (AssignmentSpecification assignmentSpecification : assignmentSpecifications) {
if (assignmentSpecification
.affectsTable(tableNames[tableIndex])) {
affected = true;
update.appendAssignmentFragment(assignmentSpecification
.getSqlAssignmentFragment());
if (assignmentSpecification.getParameters() != null) {
for (int paramIndex = 0; paramIndex < assignmentSpecification
.getParameters().length; paramIndex++) {
parameterList.add(assignmentSpecification
.getParameters()[paramIndex]);
}
}
}
}
if (affected) {
updates[tableIndex] = update.toStatementString();
assignmentParameterSpecifications[tableIndex] = parameterList
.toArray(new ParameterSpecification[parameterList
.size()]);
}
}
}