Search
Write a publication
Pull to refresh
4
0
Пригожий С.Н. @pserega

Technical Team Lead in Software Engineering, Java

Send message
Спасибо за статью.
Но мне кажется лучше использовать гибрид (xml/yaml) + чистый sql в файлах (mtm_property_tickler.sql)
SCDB — супер-пользователь для запуска (знает только ответственный DevOps)
MOBILE — премонтированная папка со скриптами для каждой схемы и нужной структурой с которой работает разработчик DB.
Вот пример
databaseChangeLog:  
  - changeSet:
      id: tag-7.1
      author: sergey_p
      context : dev,preprod
      changes:
        - tagDatabase:
              tag: 7.1
  - changeSet:
      id: sql_recomp_rollback
      author: sergey_p
      context : dev,preprod,prod
      changes:
      rollback:
        - sqlFile:
              dbms: oracle
              encoding: utf8
              path: MOBILE/recomp.sql
              relativeToChangelogFile: true
              splitStatements: false
              stripComments: false
  - changeSet:
      id: sql_file_insert
      author: sergey_p
      context : dev,preprod,prod
      changes:
        - sql:
              dbms: oracle
              sql: ALTER SESSION SET CURRENT_SCHEMA = MOBILE
        - sqlFile:
              dbms: oracle
              encoding: cp1251
              path: MOBILE/data/mtm_property_tickler.sql
              relativeToChangelogFile: true
              splitStatements: true
              stripComments: false
      rollback:
        - sql:
              dbms: oracle
              sql: ALTER SESSION SET CURRENT_SCHEMA = MOBILE
        - sqlFile:
              dbms: oracle
              encoding: cp1251
              path: MOBILE/data/rollback/mtm_property_tickler.sql
              relativeToChangelogFile: true
              splitStatements: true
              stripComments: false
        - sql:
              dbms: oracle
              sql: ALTER SESSION SET CURRENT_SCHEMA = SCDB
  - changeSet:
      id: sql_file_body
      author: sergey_p
      context : dev,preprod,prod
      changes:
        - sql:
              dbms: oracle
              sql: ALTER SESSION SET CURRENT_SCHEMA = MOBILE
        - sqlFile:
              dbms: oracle
              encoding: cp1251
              path: MOBILE/packages/body/sale_to_billing.sql
              relativeToChangelogFile: true
              splitStatements: false
              stripComments: false
      rollback:
        - sql:
              dbms: oracle
              sql: ALTER SESSION SET CURRENT_SCHEMA = MOBILE
        - sqlFile:
              dbms: oracle
              encoding: cp1251
              path: MOBILE/packages/body/rollback/sale_to_billing.sql
              relativeToChangelogFile: true
              splitStatements: false
              stripComments: false
        - sql:
              dbms: oracle
              sql: ALTER SESSION SET CURRENT_SCHEMA = SCDB
  - changeSet:
      id: sql_recomp
      author: sergey_p
      context : dev,preprod,prod
      changes:
        - sqlFile:
              dbms: oracle
              encoding: utf8
              path: MOBILE/recomp.sql
              relativeToChangelogFile: true
              splitStatements: false
              stripComments: false
      rollback:
Если используете JPA репозиторием (Hibernate), за чем перехватчики запросов использовать и думать, какая база используется.
public class QueryUtils<T> {

    private static final Logger log = LoggerFactory.getLogger(QueryUtils.class);

    @Autowired
    EntityManagerFactory entityManagerFactory;

    @Autowired
    EntityManager em;

    private final Class<T> type;

    public QueryUtils() {
        this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public String getQueryString(Filter<T> filter)
    {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<T> query = builder.createQuery(type);
        Root<T> root = query.from(type);
        Predicate predicate = filter.toSpecification().toPredicate(root, query, builder);

        if (predicate != null) {
            query.where(predicate);
        }

        QueryImpl queryI = em.createQuery(query).unwrap(QueryImpl.class);
        Map<String, TypedValue> paramMap = queryI.getQueryParameters()
.getNamedParameters();
        log.debug("map param : "+ paramMap);
        String hql = queryI.getQueryString().replace("fetch","");
        QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
        QueryTranslator queryTranslator = ast.createQueryTranslator(
                hql,hql, Collections.EMPTY_MAP,(SessionFactoryImplementor) 
        entityManagerFactory.unwrap(SessionFactory.class),null);
        queryTranslator.compile(Collections.EMPTY_MAP, true );
        log.debug("Table Sql : "+ queryTranslator.getQuerySpaces());

        String nativeSql = queryTranslator.getSQLString();

        for (TypedValue value : paramMap.values()) {
        nativeSql = nativeSql.replaceFirst("\\?", "'"+value.getValue().toString()+"'");
}

        log.debug("hql : "+ queryTranslator.getQueryString());
        log.debug("NativeSql : "+ nativeSql);

        return nativeSql;
    }
}


Можно получить запрос, не вызывая его.
За статью спасибо.

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Registered
Activity