From 36bdddca1430f687d458ed541d32ae3957bf3a68 Mon Sep 17 00:00:00 2001 From: zhouhao Date: Thu, 27 Jun 2024 17:19:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E8=A1=A8?= =?UTF-8?q?=E5=90=8D=E5=92=8C=E5=AD=97=E6=AE=B5=E8=BD=AC=E4=B9=89=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/meta/AbstractColumnMetadata.java | 13 ++- .../ezorm/core/meta/ColumnMetadata.java | 2 + .../ezorm/core/meta/SchemaMetadata.java | 2 +- .../wrapper/AbstractMapResultWrapper.java | 2 +- .../defaults/DefaultReactiveRepository.java | 4 +- .../mapping/defaults/DefaultRepository.java | 6 +- .../defaults/DefaultSyncRepository.java | 4 +- .../defaults/record/DefaultRecord.java | 60 +++++++------ .../defaults/record/RecordResultWrapper.java | 15 ++-- .../wrapper/NestedEntityResultWrapper.java | 8 +- .../metadata/AbstractTableOrViewMetadata.java | 35 +++++++- .../ezorm/rdb/metadata/RDBColumnMetadata.java | 7 +- .../ezorm/rdb/metadata/RDBSchemaMetadata.java | 61 +++++++------ .../ezorm/rdb/metadata/dialect/Dialect.java | 15 ++-- .../rdb/operator/ddl/DefaultTableBuilder.java | 88 ++++++++++--------- .../rdb/operator/ddl/LazyTableBuilder.java | 84 +++++++++--------- .../commons/RDBTableMetadataParser.java | 1 + .../mssql/SqlServerBatchUpsertOperator.java | 2 +- .../oracle/OracleBatchUpsertOperator.java | 2 +- .../oracle/OracleTableMetadataParser.java | 6 +- .../ddl/CommonAlterTableSqlBuilderTest.java | 8 +- .../delete/DefaultDeleteSqlBuilderTest.java | 2 +- ...aultForeignKeyTermFragmentBuilderTest.java | 2 +- .../update/DefaultUpdateSqlBuilderTest.java | 4 +- .../oracle/OracleTableMetaParserTest.java | 40 +++++++++ 25 files changed, 291 insertions(+), 182 deletions(-) diff --git a/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java b/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java index 71a4790e..d9543d28 100644 --- a/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java +++ b/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java @@ -12,18 +12,27 @@ @Setter public abstract class AbstractColumnMetadata implements ColumnMetadata { protected String name; + protected String realName; protected String alias; protected String comment; protected Class javaType; protected boolean updatable; protected boolean notNull; protected DictionaryCodec dictionaryCodec; - protected ValueCodec valueCodec; + protected ValueCodec valueCodec; protected DefaultValue defaultValue; protected Map properties = new ConcurrentHashMap<>(); private Map features = new ConcurrentHashMap<>(); + public String getRealName() { + return realName == null ? name : realName; + } + + public boolean realNameDetected() { + return realName != null; + } + @Override public String getAlias() { if (alias == null) { @@ -86,6 +95,6 @@ public void addFeature(Feature feature) { @Override @SneakyThrows public ObjectMetadata clone() { - return (ObjectMetadata)super.clone(); + return (ObjectMetadata) super.clone(); } } diff --git a/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/ColumnMetadata.java b/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/ColumnMetadata.java index 3be79315..5d0c8496 100644 --- a/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/ColumnMetadata.java +++ b/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/ColumnMetadata.java @@ -7,6 +7,8 @@ public interface ColumnMetadata extends FeatureSupportedMetadata, ObjectMetadata, Cloneable { String getName(); + String getRealName(); + String getAlias(); String getComment(); diff --git a/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/SchemaMetadata.java b/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/SchemaMetadata.java index 68729bf7..47f88b60 100644 --- a/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/SchemaMetadata.java +++ b/hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/SchemaMetadata.java @@ -19,7 +19,7 @@ public interface SchemaMetadata extends ObjectMetadata, FeatureSupportedMetadata Optional getObject(ObjectType type, String name); - Optional getObject(ObjectType type, String name,boolean autoLoad); + Optional getObject(ObjectType type, String name, boolean autoLoad); Optional removeObject(ObjectType type, String name); diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/wrapper/AbstractMapResultWrapper.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/wrapper/AbstractMapResultWrapper.java index eabdb415..6376f330 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/wrapper/AbstractMapResultWrapper.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/wrapper/AbstractMapResultWrapper.java @@ -53,7 +53,7 @@ protected void doWrap(T instance, String column, Object value) { if (!columnFilter.test(column)) { return; } - if (wrapperNestObject && column.contains(".")) { + if (wrapperNestObject && column.contains(".") && !column.startsWith(".")) { String[] attrs = column.split("[.]", 2); if (!columnFilter.test(attrs[0])) { return; diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultReactiveRepository.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultReactiveRepository.java index 64bb68dc..a88fdba9 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultReactiveRepository.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultReactiveRepository.java @@ -126,7 +126,7 @@ public ReactiveQuery createQuery() { public ReactiveUpdate createUpdate() { return new DefaultReactiveUpdate<>( getTable() - , operator.dml().update(getTable().getFullName()) + , operator.dml().update(getTable()) , mapping , this::applyContext , getDefaultContextKeyValue()); @@ -135,7 +135,7 @@ public ReactiveUpdate createUpdate() { @Override public ReactiveDelete createDelete() { return new DefaultReactiveDelete(getTable() - , operator.dml().delete(getTable().getFullName()) + , operator.dml().delete(getTable()) , this::applyContext , getDefaultContextKeyValue() ); diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultRepository.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultRepository.java index f0e644b2..afeb5120 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultRepository.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultRepository.java @@ -161,7 +161,7 @@ private Object getProperty(E data, String property) { protected SaveResultOperator doSave(Collection data) { Collection _data = tryMergeDuplicate(data); RDBTableMetadata table = getTable(); - UpsertOperator upsert = operator.dml().upsert(table.getFullName()); + UpsertOperator upsert = operator.dml().upsert(table); return EventResultOperator.create( () -> { @@ -188,7 +188,7 @@ protected SaveResultOperator doSave(Collection data) { protected InsertResultOperator doInsert(E data) { RDBTableMetadata table = getTable(); - InsertOperator insert = operator.dml().insert(table.getFullName()); + InsertOperator insert = operator.dml().insert(table); return EventResultOperator.create( () -> { @@ -238,7 +238,7 @@ private Object getInsertColumnValue(E data, String property) { protected InsertResultOperator doInsert(Collection batch) { Collection _data = tryMergeDuplicate(batch); RDBTableMetadata table = getTable(); - InsertOperator insert = operator.dml().insert(table.getFullName()); + InsertOperator insert = operator.dml().insert(table); return EventResultOperator.create( () -> { diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultSyncRepository.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultSyncRepository.java index 03fe0884..78d4cdbc 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultSyncRepository.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/DefaultSyncRepository.java @@ -99,12 +99,12 @@ public SyncQuery createQuery() { @Override public SyncUpdate createUpdate() { - return new DefaultSyncUpdate<>(getTable(), operator.dml().update(getTable().getFullName()), mapping); + return new DefaultSyncUpdate<>(getTable(), operator.dml().update(getTable()), mapping); } @Override public SyncDelete createDelete() { - return new DefaultSyncDelete(getTable(), operator.dml().delete(getTable().getFullName())); + return new DefaultSyncDelete(getTable(), operator.dml().delete(getTable())); } @Override diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/DefaultRecord.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/DefaultRecord.java index 47c49e34..70a4238c 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/DefaultRecord.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/DefaultRecord.java @@ -20,40 +20,48 @@ public Optional get(String key) { @Override public Optional getString(String key) { return get(key) - .map(String::valueOf); + .map(String::valueOf); } @Override public Optional getInteger(String key) { return get(key) - .map(Number.class::cast) - .map(Number::intValue); + .map(Number.class::cast) + .map(Number::intValue); } @Override public Optional getBoolean(String key) { return get(key) - .map(val -> Boolean.TRUE.equals(val) || val.equals(1)); + .map(val -> { + if (val instanceof Number) { + return ((Number) val).intValue() == 1; + } + return Boolean.TRUE.equals(val) || + "Y".equals(val) || + "y".equals(val) || + "1".equals(val); + }); } @Override public Optional getDate(String key) { return get(key) - .map(Date.class::cast); + .map(Date.class::cast); } @Override public Optional getNest(String key) { return get(key) - .map(val -> { - if (val instanceof Record) { - return ((Record) val); - } - if (val instanceof Map) { - return new DefaultRecord(((Map) val)); - } - throw new UnsupportedOperationException("value [" + val + "] is not nest property"); - }); + .map(val -> { + if (val instanceof Record) { + return ((Record) val); + } + if (val instanceof Map) { + return new DefaultRecord(((Map) val)); + } + throw new UnsupportedOperationException("value [" + val + "] is not nest property"); + }); } @Override @@ -70,17 +78,17 @@ public Record putValue(String key, Object value) { @SuppressWarnings("all") public Optional> getNests(String key) { return get(key) - .map(val -> { - if (val instanceof Record) { - return Collections.singletonList(((Record) val)); - } - if (val instanceof Map) { - return Collections.singletonList(new DefaultRecord(((Map) val))); - } - if (val instanceof Collection) { - return new ArrayList<>(((Collection) val)); - } - throw new UnsupportedOperationException("value [" + val + "] is not nest property"); - }); + .map(val -> { + if (val instanceof Record) { + return Collections.singletonList(((Record) val)); + } + if (val instanceof Map) { + return Collections.singletonList(new DefaultRecord(((Map) val))); + } + if (val instanceof Collection) { + return new ArrayList<>(((Collection) val)); + } + throw new UnsupportedOperationException("value [" + val + "] is not nest property"); + }); } } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/RecordResultWrapper.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/RecordResultWrapper.java index c9935f51..1fd22a18 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/RecordResultWrapper.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/defaults/record/RecordResultWrapper.java @@ -26,15 +26,16 @@ public void wrapColumn(ColumnWrapperContext context) { if (mapping != null) { Record record = context.getRowInstance(); - String property = mapping - .getPropertyByColumnName(context.getColumnLabel()) - .orElse(context.getColumnLabel()); - + .getPropertyByColumnName(context.getColumnLabel()) + .orElse(null); + if (property == null) { + return; + } Object value = mapping - .getColumnByProperty(property) - .map(columnMetadata -> columnMetadata.decode(context.getResult())) - .orElseGet(context::getResult); + .getColumnByProperty(property) + .map(columnMetadata -> columnMetadata.decode(context.getResult())) + .orElseGet(context::getResult); super.doWrap(record, property, value); return; diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/wrapper/NestedEntityResultWrapper.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/wrapper/NestedEntityResultWrapper.java index 8d6c1214..69a45bda 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/wrapper/NestedEntityResultWrapper.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/wrapper/NestedEntityResultWrapper.java @@ -38,10 +38,10 @@ public void wrapColumn(ColumnWrapperContext context) { ForeignKeyMetadata metadata = mapping.getTable().getForeignKey(table).orElse(null); if (null != metadata) { Object value = metadata - .getTarget() - .getColumn(column) - .map(m -> m.decode(context.getResult())) - .orElseGet(context::getResult); + .getTarget() + .getColumn(column) + .map(m -> m.decode(context.getResult())) + .orElseGet(context::getResult); GlobalConfig.getPropertyOperator().setProperty(nestInstance, column, value); } } else { diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/AbstractTableOrViewMetadata.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/AbstractTableOrViewMetadata.java index 11f0b1f3..ccc402ef 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/AbstractTableOrViewMetadata.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/AbstractTableOrViewMetadata.java @@ -84,18 +84,39 @@ public AbstractTableOrViewMetadata() { @Override public String getQuoteName() { - return quoteName == null ? quoteName = TableOrViewMetadata.super.getQuoteName() : quoteName; + if (quoteName == null) { + return quoteName = ( + getSchema().getQuoteName() + + "." + + getDialect().quote(getRealName(), realName == null) + ); + } + return quoteName; } @Override public String getFullName() { - return fullName == null ? fullName = TableOrViewMetadata.super.getFullName() : fullName; + if (fullName == null) { + if (realName != null) { + return fullName = + StringUtils.concat(getSchema().getQuoteName(), ".", getDialect().quote(getRealName(), false)); + } + return fullName = StringUtils.concat(getSchema().getQuoteName(), ".", name); + + } + return fullName; } public String getRealName() { return realName == null ? name : realName; } + public void setRealName(String realName) { + this.realName = realName; + this.quoteName = null; + this.fullName = null; + } + public boolean isTable() { return this instanceof RDBTableMetadata; } @@ -252,8 +273,16 @@ public String toString() { @Override public void merge(TableOrViewMetadata metadata) { metadata.getForeignKeys().forEach(this::addForeignKey); - metadata.getFeatureList().forEach(this::addFeature); + for (Feature feature : metadata.getFeatureList()) { + features.putIfAbsent(feature.getId(), feature); + } metadata.getColumns().forEach(this::addColumn); + if (metadata instanceof AbstractTableOrViewMetadata) { + String relName = ((AbstractTableOrViewMetadata) metadata).realName; + if (relName != null) { + this.setRealName(relName); + } + } } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java index 8bc7ada7..5cc29876 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java @@ -130,7 +130,7 @@ public Dialect getDialect() { } public String getQuoteName() { - return quoteName == null ? quoteName = getDialect().quote(getName()) : quoteName; + return quoteName == null ? quoteName = getDialect().quote(getRealName(), realName == null) : quoteName; } public void setJdbcType(SQLType jdbcType, Class javaType) { @@ -265,7 +265,8 @@ public List findFeatures(Predicate predicate) { } public String createFullName0(String ownerName) { - return getDialect().buildColumnFullName(ownerName, getName()); + + return getDialect().buildColumnFullName(ownerName, getRealName(), realName == null); } public String getFullName(String ownerName) { @@ -275,7 +276,7 @@ public String getFullName(String ownerName) { if (Objects.equals(ownerName, getOwner().getName())) { return getFullName(); } - return getDialect().buildColumnFullName(ownerName, getName()); + return getDialect().buildColumnFullName(ownerName, getRealName(), realName == null); } public boolean ddlModifiable(RDBColumnMetadata after) { diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBSchemaMetadata.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBSchemaMetadata.java index 66ebf3b3..63b05804 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBSchemaMetadata.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBSchemaMetadata.java @@ -82,6 +82,13 @@ public RDBSchemaMetadata(String name) { this.setName(name); } + + public String getQuoteName() { + return getDatabase() + .getDialect() + .quote(getName(), false); + } + @Override @SuppressWarnings("all") public RDBDatabaseMetadata getDatabase() { @@ -98,7 +105,7 @@ public Optional getTable(String name, boolean autoLoad) { } public Optional getTable(String name) { - return getTable(name,true); + return getTable(name, true); } public Mono getTableReactive(String name) { @@ -108,16 +115,16 @@ public Mono getTableReactive(String name) { public Mono getTableReactive(String name, boolean autoLoad) { if (name.contains(".")) { return this - .getDatabase() - .getObjectReactive(name, (schema, _name) -> schema.getTableReactive(_name, autoLoad)); + .getDatabase() + .getObjectReactive(name, (schema, _name) -> schema.getTableReactive(_name, autoLoad)); } return getObjectReactive(RDBObjectType.table, name, autoLoad); } public Mono getTableOrViewReactive(String name, boolean autoLoad) { return getTableReactive(name, autoLoad) - .cast(TableOrViewMetadata.class) - .switchIfEmpty(Mono.defer(() -> getViewReactive(name, autoLoad).cast(TableOrViewMetadata.class))); + .cast(TableOrViewMetadata.class) + .switchIfEmpty(Mono.defer(() -> getViewReactive(name, autoLoad).cast(TableOrViewMetadata.class))); } public Mono getTableOrViewReactive(String name) { @@ -149,7 +156,7 @@ public void addTable(RDBTableMetadata metadata) { public Mono findTableOrViewReactive(String name) { return getTableOrViewReactive(name, false) - .switchIfEmpty(getDatabase().getTableOrViewReactive(name)); + .switchIfEmpty(getDatabase().getTableOrViewReactive(name)); } public Optional findTableOrView(String name) { @@ -162,10 +169,10 @@ public Optional findTableOrView(String name) { public Optional getTableOrView(String name, boolean autoLoad) { return Optional.of(getTable(name, autoLoad) - .map(AbstractTableOrViewMetadata.class::cast)) + .map(AbstractTableOrViewMetadata.class::cast)) .filter(Optional::isPresent) .orElseGet(() -> getView(name, autoLoad) - .map(AbstractTableOrViewMetadata.class::cast)) + .map(AbstractTableOrViewMetadata.class::cast)) .map(TableOrViewMetadata.class::cast); } @@ -176,15 +183,15 @@ public Optional getTableOrView(String name) { @Override protected List loadMetadata(ObjectType type) { return super.loadMetadata(type) - .stream() - .map(this::metadataParsed) - .collect(Collectors.toList()); + .stream() + .map(this::metadataParsed) + .collect(Collectors.toList()); } @Override protected Flux loadMetadataReactive(ObjectType type) { return super.loadMetadataReactive(type) - .map(this::metadataParsed); + .map(this::metadataParsed); } @@ -205,8 +212,8 @@ protected T loadMetadata(ObjectType type, String name @Override protected Mono loadMetadataReactive(ObjectType type, String name) { return super - .loadMetadataReactive(type, name) - .map(this::metadataParsed); + .loadMetadataReactive(type, name) + .map(this::metadataParsed); } public RDBTableMetadata newTable(String name) { @@ -218,14 +225,14 @@ public RDBTableMetadata newTable(String name) { public void loadAllTable() { loadMetadata(RDBObjectType.table) - .forEach(table -> addTable(((RDBTableMetadata) table))); + .forEach(table -> addTable(((RDBTableMetadata) table))); } public Mono loadAllTableReactive() { return loadMetadataReactive(RDBObjectType.table) - .doOnNext(table -> addTable(((RDBTableMetadata) table))) - .then(); + .doOnNext(table -> addTable(((RDBTableMetadata) table))) + .then(); } @Override @@ -237,16 +244,16 @@ public Dialect getDialect() { return Optional.ofNullable(getDatabase()) .map(RDBDatabaseMetadata::getDialect) .orElseGet(() -> this - .getFeatures(RDBFeatureType.dialect) - .stream() - .findFirst() - .orElse(null)); + .getFeatures(RDBFeatureType.dialect) + .stream() + .findFirst() + .orElse(null)); } public Optional removeTableOrView(String name) { return this.removeObject(RDBObjectType.table, name) - .map(Optional::of) - .orElseGet(() -> removeObject(RDBObjectType.view, name)); + .map(Optional::of) + .orElseGet(() -> removeObject(RDBObjectType.view, name)); } @Override @@ -257,10 +264,10 @@ public RDBSchemaMetadata clone() { @Override public String toString() { return "schema " + - getName() + - " (" + getClass().getSimpleName() + ")" + - "\n" + - FeatureUtils.featureToString(getFeatureList()); + getName() + + " (" + getClass().getSimpleName() + ")" + + "\n" + + FeatureUtils.featureToString(getFeatureList()); } } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/dialect/Dialect.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/dialect/Dialect.java index d0e43917..60e90da8 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/dialect/Dialect.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/dialect/Dialect.java @@ -52,9 +52,9 @@ default String quote(String keyword, boolean changeCase) { return keyword; } return StringUtils.concat( - getQuoteStart(), - isColumnToUpperCase() && changeCase ? keyword.toUpperCase() : keyword, - getQuoteEnd() + getQuoteStart(), + isColumnToUpperCase() && changeCase ? keyword.toUpperCase() : keyword, + getQuoteEnd() ); } @@ -63,15 +63,20 @@ default String quote(String keyword) { } default String buildColumnFullName(String tableName, String columnName) { + return buildColumnFullName(tableName, columnName, true); + } + + default String buildColumnFullName(String tableName, String columnName, boolean changeCase) { if (columnName.contains(".")) { return columnName; } if (StringUtils.isNullOrEmpty(tableName)) { - return StringUtils.concat(getQuoteStart(), isColumnToUpperCase() ? columnName.toUpperCase() : columnName, getQuoteEnd()); + return StringUtils.concat(getQuoteStart(), changeCase && isColumnToUpperCase() ? columnName.toUpperCase() : columnName, getQuoteEnd()); } - return StringUtils.concat(tableName, ".", getQuoteStart(), isColumnToUpperCase() ? columnName.toUpperCase() : columnName, getQuoteEnd()); + return StringUtils.concat(tableName, ".", getQuoteStart(), changeCase && isColumnToUpperCase() ? columnName.toUpperCase() : columnName, getQuoteEnd()); } + Dialect MYSQL = new MysqlDialect(); Dialect ORACLE = new OracleDialect(); Dialect H2 = new H2Dialect(); diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/DefaultTableBuilder.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/DefaultTableBuilder.java index 6c8e5750..4e1ed51d 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/DefaultTableBuilder.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/DefaultTableBuilder.java @@ -33,7 +33,7 @@ public class DefaultTableBuilder implements TableBuilder { private boolean allowAlter = true; private boolean autoLoad = true; private boolean merge = true; - private final Set removed=new HashSet<>(); + private final Set removed = new HashSet<>(); public DefaultTableBuilder(RDBTableMetadata table) { this.table = table; @@ -47,7 +47,7 @@ public IndexBuilder index() { @Override public ForeignKeyDSLBuilder foreignKey() { - return new ForeignKeyDSLBuilder(this,table); + return new ForeignKeyDSLBuilder(this, table); } public DefaultTableBuilder custom(Consumer consumer) { @@ -64,12 +64,12 @@ public DefaultTableBuilder addColumn(RDBColumnMetadata column) { @Override public ColumnBuilder addColumn(String name) { RDBColumnMetadata rdbColumnMetaData = table - .getColumn(name) - .orElseGet(() -> { - RDBColumnMetadata columnMetaData = table.newColumn(); - columnMetaData.setName(name); - return columnMetaData; - }); + .getColumn(name) + .orElseGet(() -> { + RDBColumnMetadata columnMetaData = table.newColumn(); + columnMetaData.setName(name); + return columnMetaData; + }); return new DefaultColumnBuilder(rdbColumnMetaData, this, table); } @@ -127,13 +127,13 @@ public TableBuilder merge(boolean merge) { private SqlRequest buildAlterSql(RDBTableMetadata oldTable) { return schema - .findFeatureNow(AlterTableSqlBuilder.ID) - .build(AlterRequest.builder() - .allowDrop(dropColumn) - .newTable(table) - .allowAlter(allowAlter) - .oldTable(oldTable) - .build()); + .findFeatureNow(AlterTableSqlBuilder.ID) + .build(AlterRequest.builder() + .allowDrop(dropColumn) + .newTable(table) + .allowAlter(allowAlter) + .oldTable(oldTable) + .build()); } @Override @@ -180,35 +180,37 @@ public Mono reactive() { ReactiveSqlExecutor sqlExecutor = schema.findFeatureNow(ReactiveSqlExecutor.ID); return schema - .getTableReactive(table.getName(), autoLoad) - .map(oldTable -> { - SqlRequest request = buildAlterSql(oldTable); - if (request.isEmpty()) { - if (merge) { - oldTable.merge(table); - removed.forEach(oldTable::removeColumn); - } else { - oldTable.replace(table); - } - return Mono.just(true); + .getTableReactive(table.getName(), autoLoad) + .map(oldTable -> { + SqlRequest request = buildAlterSql(oldTable); + if (request.isEmpty()) { + if (merge) { + oldTable.merge(table); + removed.forEach(oldTable::removeColumn); + } else { + oldTable.replace(table); } - return sqlExecutor.execute(request) - .doOnSuccess(ignore -> { - oldTable.merge(table); - removed.forEach(oldTable::removeColumn); - }) - .thenReturn(true); - }) - .switchIfEmpty(Mono.fromSupplier(() -> { - SqlRequest request = schema.findFeatureNow(CreateTableSqlBuilder.ID).build(table); - if (request.isEmpty()) { - return Mono.just(true); - } - return sqlExecutor.execute(request) - .doOnSuccess(ignore -> schema.addTable(table)) - .thenReturn(true); - })) - .flatMap(Function.identity()); + return Mono.just(true); + } + return sqlExecutor + .execute(request) + .doOnSuccess(ignore -> { + oldTable.merge(table); + removed.forEach(oldTable::removeColumn); + }) + .thenReturn(true); + }) + .switchIfEmpty(Mono.fromSupplier(() -> { + SqlRequest request = schema.findFeatureNow(CreateTableSqlBuilder.ID).build(table); + if (request.isEmpty()) { + return Mono.just(true); + } + return sqlExecutor + .execute(request) + .doOnSuccess(ignore -> schema.addTable(table)) + .thenReturn(true); + })) + .flatMap(Function.identity()); } }; } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/LazyTableBuilder.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/LazyTableBuilder.java index 3232325a..86b06999 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/LazyTableBuilder.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/ddl/LazyTableBuilder.java @@ -112,13 +112,14 @@ public ForeignKeyDSLBuilder foreignKey() { private SqlRequest buildAlterSql(RDBTableMetadata table, RDBTableMetadata oldTable) { return schema - .findFeatureNow(AlterTableSqlBuilder.ID) - .build(AlterRequest.builder() - .allowDrop(dropColumn) - .newTable(table) - .allowAlter(allowAlter) - .oldTable(oldTable) - .build()); + .findFeatureNow(AlterTableSqlBuilder.ID) + .build(AlterRequest + .builder() + .allowDrop(dropColumn) + .newTable(table) + .allowAlter(allowAlter) + .oldTable(oldTable) + .build()); } private void accept(RDBTableMetadata table) { @@ -181,41 +182,42 @@ public Mono reactive() { ReactiveSqlExecutor sqlExecutor = schema.findFeatureNow(ReactiveSqlExecutor.ID); return schema - .getTableReactive(tableName, autoLoad) - .map(oldTable -> { - RDBTableMetadata newTable = oldTable.clone(); - accept(newTable); - removed.forEach(newTable::removeColumn); - SqlRequest request = buildAlterSql(newTable, oldTable); - if (request.isEmpty()) { - if (merge) { - oldTable.merge(newTable); - removed.forEach(oldTable::removeColumn); - } else { - oldTable.replace(newTable); - } - return Mono.just(true); + .getTableReactive(tableName, autoLoad) + .map(oldTable -> { + RDBTableMetadata newTable = oldTable.clone(); + accept(newTable); + removed.forEach(newTable::removeColumn); + SqlRequest request = buildAlterSql(newTable, oldTable); + if (request.isEmpty()) { + if (merge) { + oldTable.merge(newTable); + removed.forEach(oldTable::removeColumn); + } else { + oldTable.replace(newTable); } - return sqlExecutor.execute(request) - .doOnSuccess(ignore -> { - oldTable.merge(newTable); - removed.forEach(oldTable::removeColumn); - }) - .thenReturn(true); - }) - .switchIfEmpty(Mono.fromSupplier(() -> { - RDBTableMetadata newTable = schema.newTable(tableName); - accept(newTable); - SqlRequest request = schema.findFeatureNow(CreateTableSqlBuilder.ID).build(newTable); - if (request.isEmpty()) { - return Mono.just(true); - } - return sqlExecutor - .execute(request) - .doOnSuccess(ignore -> schema.addTable(newTable)) - .thenReturn(true); - })) - .flatMap(Function.identity()); + return Mono.just(true); + } + return sqlExecutor + .execute(request) + .doOnSuccess(ignore -> { + oldTable.merge(newTable); + removed.forEach(oldTable::removeColumn); + }) + .thenReturn(true); + }) + .switchIfEmpty(Mono.fromSupplier(() -> { + RDBTableMetadata newTable = schema.newTable(tableName); + accept(newTable); + SqlRequest request = schema.findFeatureNow(CreateTableSqlBuilder.ID).build(newTable); + if (request.isEmpty()) { + return Mono.just(true); + } + return sqlExecutor + .execute(request) + .doOnSuccess(ignore -> schema.addTable(newTable)) + .thenReturn(true); + })) + .flatMap(Function.identity()); } }; } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/commons/RDBTableMetadataParser.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/commons/RDBTableMetadataParser.java index 4996556e..77ef6a12 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/commons/RDBTableMetadataParser.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/commons/RDBTableMetadataParser.java @@ -312,6 +312,7 @@ protected void applyColumnInfo(RDBColumnMetadata column, Record record) { record.getString("name") // .map(String::toLowerCase) .ifPresent(name -> { + column.setRealName(name); column.setName(name); column.setProperty("old-name", name); }); diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/mssql/SqlServerBatchUpsertOperator.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/mssql/SqlServerBatchUpsertOperator.java index 68174525..5a88d447 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/mssql/SqlServerBatchUpsertOperator.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/mssql/SqlServerBatchUpsertOperator.java @@ -136,7 +136,7 @@ private Map> createColumnIndex( @Override public SqlRequest build(InsertOperatorParameter parameter) { if (PREFIX == null) { - PREFIX = SqlFragments.of("merge into", table.getFullName(), "with(rowlock) as t using ( values"); + PREFIX = SqlFragments.of("merge into", table.getQuoteName(), "with(rowlock) as t using ( values"); } UpsertOperatorParameter upsertParameter = (UpsertOperatorParameter) parameter; BatchSqlFragments fragments = new BatchSqlFragments(); diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleBatchUpsertOperator.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleBatchUpsertOperator.java index d8e79f1e..bd825b2a 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleBatchUpsertOperator.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleBatchUpsertOperator.java @@ -144,7 +144,7 @@ protected int computeSqlSize(int columnSize, int valueSize) { @Override public SqlRequest build(InsertOperatorParameter parameter) { if (PREFIX == null) { - PREFIX = SqlFragments.of("merge into", table.getFullName(), "t using ("); + PREFIX = SqlFragments.of("merge into", table.getQuoteName(), "t using ("); } OracleUpsertOperatorParameter upsertParameter = (OracleUpsertOperatorParameter) parameter; diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetadataParser.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetadataParser.java index ed5ee840..36125d34 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetadataParser.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetadataParser.java @@ -12,7 +12,6 @@ public class OracleTableMetadataParser extends RDBTableMetadataParser { private final static String TABLE_META_SQL = String.join( " ", "select distinct(cols.column_name) as \"name\"", - ",cols.table_name as \"table_name\"", ",cols.data_type as \"data_type\"", ",cols.data_length as \"data_length\"", ",cols.data_precision as \"data_precision\"", @@ -20,8 +19,11 @@ public class OracleTableMetadataParser extends RDBTableMetadataParser { ",acc.comments as \"comment\"", ",case when cols.nullable='Y' then 0 else 1 end as \"not_null\"", ",cols.table_name as \"table_name\"", + ",case when c.constraint_type='P' then 1 else 0 end as \"primary_key\"", ",cols.column_id from all_tab_cols cols", - "left join all_col_comments acc on acc.OWNER = #{schema} and acc.column_name=cols.column_name and acc.table_name=cols.table_name", + "left join all_col_comments acc on acc.owner = cols.owner and acc.column_name=cols.column_name and acc.table_name=cols.table_name", + "left join all_cons_columns con_col ON con_col.owner = cols.owner and con_col.table_name = cols.table_name and con_col.column_name = cols.column_name", + "left join all_constraints c on c.owner = cols.owner and c.constraint_name = con_col.constraint_name", "where cols.owner=#{schema} and cols.table_name like upper(#{table})", "and cols.table_name not like '%$%'", "and cols.table_name not like 'LOGMNR%'", diff --git a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/ddl/CommonAlterTableSqlBuilderTest.java b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/ddl/CommonAlterTableSqlBuilderTest.java index 537f66be..188de1ea 100644 --- a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/ddl/CommonAlterTableSqlBuilderTest.java +++ b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/ddl/CommonAlterTableSqlBuilderTest.java @@ -67,8 +67,8 @@ public void test() { System.out.println(sql); List sqlList = ((BatchSqlRequest) sql).getBatch(); Assert.assertEquals(sqlList.size(), 1); - Assert.assertEquals(sql.getSql(), "alter table PUBLIC.test add \"TEST\" varchar(32)"); - Assert.assertEquals(sqlList.get(0).getSql(), "comment on column PUBLIC.test.\"TEST\" is 'test'"); + Assert.assertEquals(sql.getSql(), "alter table \"PUBLIC\".test add \"TEST\" varchar(32)"); + Assert.assertEquals(sqlList.get(0).getSql(), "comment on column \"PUBLIC\".test.\"TEST\" is 'test'"); } @@ -81,7 +81,7 @@ public void test() { .oldTable(old) .newTable(copy) .build()); - Assert.assertEquals(sql.getSql(), "alter table PUBLIC.test modify \"NAME\" varchar(200) null"); + Assert.assertEquals(sql.getSql(), "alter table \"PUBLIC\".test modify \"NAME\" varchar(200) null"); } { @@ -93,7 +93,7 @@ public void test() { .allowDrop(true) .build()); - Assert.assertEquals(sql.getSql(), "alter table PUBLIC.test drop column \"NAME\""); + Assert.assertEquals(sql.getSql(), "alter table \"PUBLIC\".test drop column \"NAME\""); } } diff --git a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/delete/DefaultDeleteSqlBuilderTest.java b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/delete/DefaultDeleteSqlBuilderTest.java index 04682569..5b172444 100644 --- a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/delete/DefaultDeleteSqlBuilderTest.java +++ b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/delete/DefaultDeleteSqlBuilderTest.java @@ -30,7 +30,7 @@ public void test(){ SqlRequest sql= builder.build(parameter); System.out.println(sql); - Assert.assertEquals(sql.getSql(),"delete from PUBLIC.test where \"ID\" = ? and \"NAME\" is not null"); + Assert.assertEquals(sql.getSql(),"delete from \"PUBLIC\".test where \"ID\" = ? and \"NAME\" is not null"); } } \ No newline at end of file diff --git a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/term/DefaultForeignKeyTermFragmentBuilderTest.java b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/term/DefaultForeignKeyTermFragmentBuilderTest.java index 6d8ae971..4e0392d9 100644 --- a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/term/DefaultForeignKeyTermFragmentBuilderTest.java +++ b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/term/DefaultForeignKeyTermFragmentBuilderTest.java @@ -54,7 +54,7 @@ public void test() { SqlRequest request = fragments.toRequest(); System.out.println(fragments.toRequest()); - Assert.assertEquals(request.getSql(), "exists( select 1 from PUBLIC.detail detail where test.\"ID\" = detail.\"ID\" and ( ( detail.\"ID\" = ? or detail.\"ID\" = ? ) and ( detail.\"COMMENT\" = ? ) ) )"); + Assert.assertEquals(request.getSql(), "exists( select 1 from \"PUBLIC\".detail detail where test.\"ID\" = detail.\"ID\" and ( ( detail.\"ID\" = ? or detail.\"ID\" = ? ) and ( detail.\"COMMENT\" = ? ) ) )"); } diff --git a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/update/DefaultUpdateSqlBuilderTest.java b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/update/DefaultUpdateSqlBuilderTest.java index 1a63b4fd..4c4759ac 100644 --- a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/update/DefaultUpdateSqlBuilderTest.java +++ b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/update/DefaultUpdateSqlBuilderTest.java @@ -46,7 +46,7 @@ public void test() { SqlRequest request = builder.build(parameter); System.out.println(request); - assertEquals(request.getSql(), "update PUBLIC.test set \"NAME\" = ? where \"ID\" = ? and \"NAME\" is not null"); + assertEquals(request.getSql(), "update \"PUBLIC\".test set \"NAME\" = ? where \"ID\" = ? and \"NAME\" is not null"); assertArrayEquals(request.getParameters(), new Object[]{"admin", "1234"}); } @@ -91,7 +91,7 @@ public String getName() { SqlRequest request = builder.build(parameter); System.out.println(request); - assertEquals("update PUBLIC.test set \"NAME\" = name + ? where \"ID\" = ?",request.getSql()); + assertEquals("update \"PUBLIC\".test set \"NAME\" = name + ? where \"ID\" = ?",request.getSql()); assertArrayEquals(request.getParameters(), new Object[]{1, "1234"}); } diff --git a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetaParserTest.java b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetaParserTest.java index 4525f207..b5d715ae 100644 --- a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetaParserTest.java +++ b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/oracle/OracleTableMetaParserTest.java @@ -4,9 +4,15 @@ import org.hswebframework.ezorm.rdb.TestSyncSqlExecutor; import org.hswebframework.ezorm.rdb.executor.SqlRequests; import org.hswebframework.ezorm.rdb.executor.SyncSqlExecutor; +import org.hswebframework.ezorm.rdb.mapping.SyncRepository; +import org.hswebframework.ezorm.rdb.mapping.defaults.record.Record; import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata; +import org.hswebframework.ezorm.rdb.metadata.RDBDatabaseMetadata; import org.hswebframework.ezorm.rdb.metadata.RDBFeatureType; import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata; +import org.hswebframework.ezorm.rdb.metadata.dialect.Dialect; +import org.hswebframework.ezorm.rdb.operator.DatabaseOperator; +import org.hswebframework.ezorm.rdb.operator.DefaultDatabaseOperator; import org.hswebframework.ezorm.rdb.operator.builder.Paginator; import org.junit.Assert; import org.junit.Before; @@ -74,6 +80,40 @@ public void testParseAll() { Assert.assertEquals("test_table_all", metadata.getRealName()); + for (RDBColumnMetadata column : metadata.getColumns()) { + System.out.println(column); + } + + RDBDatabaseMetadata + databaseMetadata = new RDBDatabaseMetadata(Dialect.ORACLE); + databaseMetadata.addSchema(schema); + databaseMetadata.setCurrentSchema(schema); + databaseMetadata.addFeature(executor); + DatabaseOperator databaseOperator = DefaultDatabaseOperator.of(databaseMetadata); + + SyncRepository repository = databaseOperator + .dml() + .createRepository("test_table_all"); + + repository + .save(Record.newRecord().putValue("id", "test").putValue("NAME", "test").putValue("AGE", 1)); + + repository.findById("test"); + + repository.createUpdate() + .where("id", "test") + .set("NAME", "test2") + .execute(); + + System.out.println(repository + .createQuery() + .paging(0, 10) + .fetch()); + + repository + .createDelete() + .where("id", "test") + .execute(); } finally { executor.execute(prepare("drop table \"test_table_all\"")); }