{"id":376229,"date":"2024-05-21T06:45:18","date_gmt":"2024-05-21T06:45:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=376229"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=376229","title":{"rendered":"<span>\u0420\u0435\u0446\u0435\u043f\u0442\u044b \u00ab\u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u00bb Hibernate, \u0438\u043b\u0438 \u0440\u0435\u0448\u0430\u0435\u043c 5 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Hibernate \u2014 \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 ORM (Object-Relational Mapping) \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u041e\u043d \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u043e\u0433\u0438\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u0442\u044b\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u00ab\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u00bb.\u00a0<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0434\u0440\u0435\u0439 \u0417\u044f\u0431\u043b\u0438\u043d, \u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 Magnit Tech. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0446\u0435\u043f\u0442\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Hibernate \u0438 Spring Data JPA: \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.\u00a0\u00a0<\/p>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\u00a0\u00a0<\/h2>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0420\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u00ab\u0447\u0438\u0441\u0442\u044b\u0439\u00bb JDBC. \u041c\u0438\u043d\u0443\u0441\u044b \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b: \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0411\u0414, \u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u00ab\u0447\u0438\u0441\u0442\u043e\u0433\u043e\u00bb JDBC \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 ORM. \u041e\u0434\u043d\u0430\u043a\u043e Hibernate \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e, \u0430 \u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c \u0438\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Java Stream. \u041f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c Database Undirectional Cursor. \u041f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u00ab\u0447\u0438\u0441\u0442\u043e\u043c\u0443\u00bb JDBC.\u00a0<\/p>\n<p>\u041a\u043e\u0434 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u0421\u00a0 \u043f\u043e\u043c\u043e\u0449\u044c\u044e EntityManager \u0441\u043e\u0437\u0434\u0430\u0435\u043c Query, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 getResultStream \u0432 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e forEach \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u043b\u0438.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = entityManager  .createQuery(\"from BigTable\", BigTable.class)  .getResultStream()) {  bigTableStream.forEach(bigTable -> counter.incrementAndGet());  log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  } <\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434:\u00a0<\/p>\n<p>record fetched 10000000, time spent 12\u00a0<\/p>\n<p>\u0422\u0443\u0442 10 \u043c\u043b\u043d \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u0447\u0438\u0442\u0430\u043d\u043e \u0437\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0438 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442.\u00a0<\/p>\n<p>\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c JPA-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 Stream, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0451 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">public interface BigTableRepository extends CrudRepository&lt;BigTable, Long> {  @Query(\"select b from BigTable b\")  Stream&lt;BigTable> getAll();    }<\/code><\/pre>\n<pre><code class=\"java\">var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = bigTableRepository.getAll()) {  bigTableStream.forEach(bigTable -> counter.incrementAndGet());  log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0411\u0414 \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Stream API. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Postgres \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0435\u0442\u0447\u0430 \u2014 fetch size. \u042d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 spring.jpa.properties.hibernate.jdbc.fetch_size \u043b\u0438\u0431\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u043a\u043e\u0434\u0435.\u00a0<\/p>\n<p>\u0414\u043b\u044f Hibernate \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a: <\/p>\n<pre><code class=\"java\">public void fetchAllByHibernate() {  var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = entityManager      .createQuery(\"from BigTable\", BigTable.class)      .setHint(AvailableHints.HINT_FETCH_SIZE, 50)      .getResultStream()) {      bigTableStream.forEach(bigTable -> counter.incrementAndGet());      log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  }  }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0435\u0442\u0447\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setHint.\u00a0<\/p>\n<p>\u0414\u043b\u044f Spring JPA \u043a\u043e\u0434 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">public interface BigTableRepository extends CrudRepository&lt;BigTable, Long> {    @QueryHints(      @QueryHint(name = HINT_FETCH_SIZE, value = \"25\")  )  @Query(\"select b from BigTable b\")  Stream&lt;BigTable> getAll();    }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0435\u0442\u0447\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 QueryHints.\u00a0<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0444\u0435\u0442\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f Postgres, MySQL. \u0414\u043b\u044f Oracle \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u043e, \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0438\u043c\u044f\u0442\u0441\u044f \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0435\u0442\u0447\u0430.\u00a0<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0438 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Stream API:\u00a0<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 try-with-resources statement,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 hint fetch size,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 stream.filter, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432 \u0441\u0442\u0440\u0438\u043c\u0430\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0442.\u043f.,<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f OneToMany, ManyToMany.\u00a0<\/p>\n<\/li>\n<\/ul>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Hibernate\u00a0<\/h2>\n<h3>StatelessSession\u00a0<\/h3>\n<p>Hibernate \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0439. \u041d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (dirty checks), \u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f (flushes), \u043a\u044d\u0448 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438 \u0442.\u043f. \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0412 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c StatelessSession.\u00a0\u00a0<\/p>\n<p>StatelessSession \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u044d\u0448 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (dirty checks) \u0438\u043b\u0438 write-behind. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043b\u0435\u043d\u0438\u0432\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u0432\u044f\u0437\u0435\u0439 \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u044d\u0448\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432.\u00a0\u00a0<\/p>\n<p>StatelessSession \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c StreamAPI \u0438 StatelessSession.\u00a0\u00a0\u00a0<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435.\u00a0\u00a0<\/p>\n<pre><code class=\"java\">public void fetchStateless() {  var sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);  var statelessSession = sessionFactory.openStatelessSession();  statelessSession.getTransaction().begin();  var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = statelessSession      .createQuery(\"from BigTable\", BigTable.class)      .setHint(AvailableHints.HINT_FETCH_SIZE, 50)      .getResultStream()) {      bigTableStream.forEach(bigTable -> counter.incrementAndGet());      log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  }  statelessSession.getTransaction().commit();  }<\/code><\/pre>\n<p>\u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c SessionFactory, \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 StatelessSession \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0441\u0442\u0440\u0438\u043c\u0438\u043c \u0442\u0430\u043a \u0436\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u043c\u0435\u0442\u043e\u0434 getResultStream.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c:<\/p>\n<pre><code class=\"java\">public void writeStateless() {  var sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);  var statelessSession = sessionFactory.openStatelessSession();  statelessSession.getTransaction().begin();  BigTable record = BigTable.builder().name(\"insert\").build();  statelessSession.insert(record);  record.setName(\"update\");  statelessSession.update(record);  statelessSession.getTransaction().commit();  }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043c \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Insert \u0438 Update. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Hibernate \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442, \u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f dirty checks. \u0415\u0441\u043b\u0438 \u0433\u0440\u0430\u0444 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f dirty checks \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u043e\u0438\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u043e, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0430\u0441\u0442\u0438.\u00a0<\/p>\n<h3>Batch Insert\/Update<\/h3>\n<p>\u0410 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u0449\u0451 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c\u0441\u044f? \u0410 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \ud83d\ude42 \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">public void insertStateless() {  var sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);  var statelessSession = sessionFactory.openStatelessSession();  statelessSession.setJdbcBatchSize(7);  statelessSession.getTransaction().begin();  for (long i = 1; i &lt;= 100; i++) {      BigTable record = BigTable.builder().name(\"value\" + i).build();      statelessSession.insert(record);  }  statelessSession.getTransaction().commit();  } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435.\u00a0\u00a0<\/p>\n<pre><code class=\"java\">statelessSession.setJdbcBatchSize(7);<\/code><\/pre>\n<p>\u0412 \u043b\u043e\u0433\u0430\u0445 \u0432\u0438\u0434\u0438\u043c:\u00a0<\/p>\n<p>Type:Prepared, Batch:True, QuerySize:1, BatchSize:7\u00a0<\/p>\n<p>Query:[&#171;insert into &#171;BIG_TABLE&#187; (&#171;NAME&#187;,&#187;id&#187;) values (?,?)&#187;]\u00a0<\/p>\n<p>Params:[(value92,102),(value93,103),(value94,104),(value95,105),(value96,106),(value97,107),(value98,108)]\u00a0<\/p>\n<p>\u00a0\u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e:\u00a0<\/p>\n<pre><code class=\"java\">spring:    jpa:  properties:    hibernate:      order_inserts: true      jdbc.batch_size: 7<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438\/\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430 \u0441\u0447\u0451\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0411\u0414.\u00a0<\/p>\n<p>\u0415\u0449\u0451 \u0437\u0434\u0435\u0441\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u044f order_inserts (\u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f order_updates) \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.\u00a0<\/p>\n<p>\u0414\u0430, \u0442\u0430\u043a\u0438\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043b\u043e\u0433\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e net.ttddyy:datasource-proxy.\u00a0<\/p>\n<h3>DynamicUpdate\u00a0<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, Hibernate \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b SQL \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 CRUD \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u042d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 SQL \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SQL-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.\u00a0\u00a0<\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u043e\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0439 \u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043b\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, LOB). \u0420\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 @DynamicUpdate. \u0415\u0441\u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439, Hibernate \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SQL: \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 SQL \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u043e \u043f\u043b\u044e\u0441 \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SQL \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"DYNAMIC_TABLE\")  @DynamicUpdate  public class DynamicTable {<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, Hibernate \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0435\u0447\u044c \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u043c. \u0418\u043b\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0438\u043b\u0438 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b. \u041e\u0431\u044b\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043e\u0440\u043e\u0433\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u0431\u044f \u043e\u043f\u0440\u0430\u0432\u0434\u044b\u0432\u0430\u0435\u0442.\u00a0\u00a0<\/p>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u0438\u00a0\u00a0<\/h3>\n<p>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u043f\u043e\u0434\u043e\u0431\u043d\u043e @DynamicUpdate, \u0442\u043e\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.\u00a0\u00a0<\/p>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f DTO-\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439.\u00a0<\/p>\n<p>\u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e DTO \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041d\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c.\u00a0<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0411\u0414 \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"java\">public class WideTable {    @Id  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"sequence\")  @SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_WIDE_TABLE\", allocationSize = 1)  private Long id;    private String field1;    private String field2;    private String field3;    private String field4;  } <\/code><\/pre>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043b\u044f: field2 \u0438 field3.\u00a0<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c DTO-\u043a\u043b\u0430\u0441\u0441 (\u0437\u0434\u0435\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 record, \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c lombook).\u00a0<\/p>\n<pre><code class=\"java\">public record WideTableDto(String field2, String field3) {    }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0438:\u00a0<\/p>\n<pre><code class=\"java\">public interface WideTableRepository extends CrudRepository&lt;WideTable, Long> {    List&lt;WideTableDto> findByField1(String field1);    }<\/code><\/pre>\n<p>\u0412\u044b\u0437\u043e\u0432\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0438 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e Hibernate \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u043d\u0443\u0436\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043c\u0430\u043f\u043f\u0438\u043b DTO.\u00a0<\/p>\n<pre><code class=\"java\">public void fetchWideTableDto() {  var field1 = \"field1\";  wideTableRepository.save(WideTable.builder().field1(field1).field2(\"field2\").field3(\"field3\").field4(\"field4\").build());  wideTableRepository.findByField1(field1).stream().map(WideTableDto::toString).forEach(log::info);  }<\/code><\/pre>\n<p>Hibernate: insert into &#171;WIDE_TABLE&#187; (&#171;field1&#8243;,&#187;field2&#8243;,&#187;field3&#8243;,&#187;field4&#8243;,&#187;id&#187;) values (?,?,?,?,?)\u00a0<\/p>\n<p>Hibernate: select wt1_0.&#187;field2&#8243;,wt1_0.&#187;field3&#8243; from &#171;WIDE_TABLE&#187; wt1_0 where wt1_0.&#187;field1&#8243;=?\u00a0<\/p>\n<p>\u0412\u0441\u0451 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u00a0 <\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 N+1\u00a0<\/h2>\n<p>\u042d\u0442\u043e \u043a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043c\u0435\u043d\u044c Hibernate. \u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u0430\u0445 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0447\u0430\u0441\u0442\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e Hibernate.\u00a0<\/p>\n<p>\u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.\u00a0\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438: \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430.<\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"CUSTOMER\")  public class Customer {    @Id  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"sequence\")  @SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_CUSTOMER\", allocationSize = 1)  private Long id;    @Column(name = \"NAME\")  private String name;    @OneToMany  private List&lt;Operation> operations;      }<\/code><\/pre>\n<pre><code class=\"java\">@Entity  @Table(name = \"OPERATION\")  public class Operation {    @Id  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"sequence\")  @SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_OPERATION\", allocationSize = 1)  private Long id;    @Column(name = \"QUANTITY\")  private Long quantity;    @ManyToOne  @JoinColumn(name = \"customer_id\")  private Customer customer;    }<\/code><\/pre>\n<p>\u0412\u044b\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u0446\u0438\u043a\u043b\u0435:\u00a0<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e Hibernate \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441:\u00a0\u00a0<\/p>\n<p>select o1_0.&#187;customer_id&#187;,o1_1.&#187;id&#187;,c1_0.&#187;id&#187;,c1_0.&#187;name&#187;,o1_1.&#187;quantity&#187; from &#171;customer_operations&#187; o1_0 join &#171;operation&#187; o1_1 on o1_1.&#187;id&#187;=o1_0.&#187;operations_id&#187; left join &#171;customer&#187; c1_0 on c1_0.&#187;id&#187;=o1_1.&#187;customer_id&#187; where o1_0.&#187;customer_id&#187;=?\u00a0<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 Hibernate \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 N \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0433\u0434\u0435 N \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c.\u00a0<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0417\u0434\u0435\u0441\u044c \u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435.\u00a0<\/p>\n<p>\u0412 Hibernate \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f BatchSize. \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f BatchSize(size=n) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e Hibernate \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 operations) \u043f\u0430\u0447\u043a\u0430\u043c\u0438 \u043f\u043e n \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Customer \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a: <\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"CUSTOMER\")  public class Customer {    @Id  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"sequence\")  @SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_CUSTOMER\", allocationSize = 1)  private Long id;    @Column(name = \"NAME\")  private String name;    @OneToMany  @BatchSize(size = 50)  private List&lt;Operation> operations;      }<\/code><\/pre>\n<p>\u0410 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0442\u0430\u043b \u0442\u0430\u043a\u0438\u043c:\u00a0<\/p>\n<p>select o1_0.&#187;customer_id&#187;,o1_1.&#187;id&#187;,c1_0.&#187;id&#187;,c1_0.&#187;name&#187;,o1_1.&#187;quantity&#187; from &#171;customer_operations&#187; o1_0 join &#171;operation&#187; o1_1 on o1_1.&#187;id&#187;=o1_0.&#187;operations_id&#187; left join &#171;customer&#187; c1_0 on c1_0.&#187;id&#187;=o1_1.&#187;customer_id&#187; where o1_0.&#187;customer_id&#187; in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)\u00a0<\/p>\n<p>Hibernate \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c IN, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c 50 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414 \u0431\u0443\u0434\u0435\u0442 \u0432 50 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435\u00a0<\/p>\n<p>Hibernate \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 Fetch.\u00a0\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f FetchMode.SUBSELECT \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 N + 1.\u00a0\u00a0<\/p>\n<p>FetchMode.SUBSELECT \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e Hibernate \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043e\u0434\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 BatchSize, \u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 in \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\u00a0<\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"CUSTOMER\")  public class Customer {    @Id  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"sequence\")  @SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_CUSTOMER\", allocationSize = 1)  private Long id;    @Column(name = \"NAME\")  private String name;    @OneToMany  @Fetch(FetchMode.SUBSELECT)  private List&lt;Operation> operations;    }<\/code><\/pre>\n<p>\u0410 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0442\u0430\u043b \u0442\u0430\u043a\u0438\u043c:\u00a0<\/p>\n<p>select o1_0.&#187;customer_id&#187;,o1_1.&#187;id&#187;,c2_0.&#187;id&#187;,c2_0.&#187;name&#187;,o1_1.&#187;quantity&#187; from &#171;customer_operations&#187; o1_0 join &#171;operation&#187; o1_1 on o1_1.&#187;id&#187;=o1_0.&#187;operations_id&#187; left join &#171;customer&#187; c2_0 on c2_0.&#187;id&#187;=o1_1.&#187;customer_id&#187; where o1_0.&#187;customer_id&#187; in (select c1_0.&#187;id&#187; from &#171;customer&#187; c1_0)\u00a0<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c.\u00a0<\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432.\u00a0FetchMode.SUBSELECT \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0435\u0439 (\u0431\u0430\u0433 Hibernate), BatchSize \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0435\u0439, \u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. <\/p>\n<h2>\u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0447\u0443\u0436\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/h2>\n<p>\u0411\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 \u0432\u0430\u043c \u0441\u0432\u043e\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 API. \u0423 \u0432\u0430\u0441 \u0432 \u0411\u0414 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.\u00a0<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"OUTER_TABLE\")  public class OuterTable {    @Id  private Long id;    private String name;    } <\/code><\/pre>\n<p>\u0415\u0451 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043c\u0430\u043f\u0438\u0442\u044c \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443:\u00a0<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/057\/2ef\/a56\/0572efa5605444693e54833803158572.png\" width=\"362\" height=\"114\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/057\/2ef\/a56\/0572efa5605444693e54833803158572.png\"\/><\/figure>\n<p>\u00a0<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0439-\u0434\u043e\u0431\u0440\u044b\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0432 XML. \u0412 \u0448\u0435\u0441\u0442\u043e\u043c Hibernate \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u0444\u0430\u0439\u043b outertable.hbm.xml.<\/p>\n<pre><code class=\"java\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>  &lt;!DOCTYPE hibernate-mapping SYSTEM \"classpath:\/\/org\/hibernate\/hibernate-mapping-3.0.dtd\">  &lt;hibernate-mapping>  &lt;class name=\"com.tander.hibernate.model.OuterTable\" table=\"MAIN_TABLE\" >      &lt;id name=\"id\" column=\"ID\" type=\"long\">      &lt;\/id>      &lt;property name=\"name\" column=\"MAIN_NAME\" type=\"string\" \/>  &lt;\/class>  &lt;\/hibernate-mapping><\/code><\/pre>\n<p>\u0418 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 application.yml\u00a0<\/p>\n<pre><code class=\"java\">spring:    jpa:  mapping-resources: outertable.hbm.xml <\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0439:<\/p>\n<pre><code class=\"java\">public interface OuterTableRepository extends CrudRepository&lt;OuterTable, Long> {  }<\/code><\/pre>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c:\u00a0<\/p>\n<pre><code class=\"java\">outerTableRepository.save(OuterTable.builder().id(1L).name(\"name\").build());<\/code><\/pre>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0439, \u0432\u0441\u0442\u0430\u0432\u043a\u0430. \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e Hibernate \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.\u00a0<\/p>\n<p>insert into &#171;MAIN_TABLE&#187; (&#171;MAIN_NAME&#187;,&#187;ID&#187;) values (?,?)\u00a0<\/p>\n<h2>\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 SQL \u0432 Java-\u043a\u043e\u0434\u0435\u00a0\u00a0<\/h2>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c SQL\/HQL \u043a\u043e\u0434 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f\u0445. \u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u044d\u0442\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0434\u0430\u0436\u0435 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432 Java \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 (\u0432 Java-\u043a\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e Java-\u043a\u043e\u0434, \u043f\u043e-\u043c\u043e\u0435\u043c\u0443, \u0442\u0430\u043a \ud83d\ude42 \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<pre><code class=\"java\">@Query(nativeQuery = true, value = \"select * from BIG_TABLE\")  List&lt;BigTable> getAllNative(); <\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u0444\u0430\u0439\u043b queries.hbm.xml\u00a0<\/p>\n<pre><code class=\"java\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>  &lt;!DOCTYPE hibernate-mapping SYSTEM \"classpath:\/\/org\/hibernate\/hibernate-mapping-3.0.dtd\">  &lt;hibernate-mapping>  &lt;sql-query name=\"BigTable.getAllNative\">     &lt;return  entity-name=\"com.tander.hibernate.model.BigTable\" alias=\"b\"\/>     &lt;![CDATA[        select * from BIG_TABLE     ]]&gt;  &lt;\/sql-query>  &lt;\/hibernate-mapping><\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 xml \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: &lt;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438>.&lt;\u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f>.\u00a0\u00a0<\/p>\n<p>\u00a0\u0412 application.yml \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435: <\/p>\n<pre><code class=\"java\"><\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0442\u0430\u043a:\u00a0<\/p>\n<pre><code class=\"java\">@Query(nativeQuery = true)  List&lt;BigTable> getAllNative();<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0430\u0433\u0438\u044f Spring, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u043d\u0430\u0439\u0434\u0451\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. <\/p>\n<pre><code class=\"java\">var records =   bigTableRepository.getAllNative();  log.info(\"record fetched {} \", records.size());<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434:\u00a0<\/p>\n<p>select * from BIG_TABLE<\/p>\n<p>\u00a0record fetched 10\u00a0<\/p>\n<p>\u00a0\u0418 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e SQL-\u043a\u043e\u0434\u0430 \u0432 Java. <\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u043b\u0435\u0439<\/h3>\n<p>\u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0434\u0430\u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e hibernate \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @Formula. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.\u00a0<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c: <\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"FORMULA_TABLE\")  public class FormulaTable {    @Id  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"sequence\")  @SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_FORMULA_TABLE\", allocationSize = 1)  private Long id;    @Column(name=\"PRICE\")  private BigDecimal price;    @Column(name=\"QUANTITY\")  private BigDecimal quantity;    }<\/code><\/pre>\n<p><strong>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0435\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/strong>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c: \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0446\u0435\u043d\u0443 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c @Formula:\u00a0<\/p>\n<pre><code class=\"java\">@Formula(\"price * quantity\")  private BigDecimal cost;<\/code><\/pre>\n<p>Hibernate \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u043c \u043f\u043e\u043b\u0435\u043c:\u00a0<\/p>\n<p>select ft1_0.&#187;id&#187;,ft1_0.price * ft1_0.quantity,ft1_0.&#187;PRICE&#187;,ft1_0.&#187;QUANTITY&#187; from &#171;FORMULA_TABLE&#187; ft1_0\u00a0<\/p>\n<p><strong>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/strong>.\u00a0\u0418\u043d\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0421\u0423\u0411\u0414, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Hibernate, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 SECURE_RAND. @Formula \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.\u00a0 \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u0435 \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"java\">@Formula(\"SECURE_RAND(quantity)\")  private int secureRand; <\/code><\/pre>\n<p>Hibernate \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0438\u0434\u0451\u0442 \u0432\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u00a0<\/p>\n<p>select ft1_0.&#187;id&#187;,ft1_0.&#187;PRICE&#187;,ft1_0.&#187;QUANTITY&#187;,SECURE_RAND(ft1_0.quantity) from &#171;FORMULA_TABLE&#187; ft1_0\u00a0\u00a0\u00a0<\/p>\n<p><strong>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/strong>. \u041f\u043e\u0440\u043e\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0434\u043e \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439. @Formula \u0438 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c.\u00a0<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u0435 \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c:\u00a0<\/p>\n<pre><code class=\"java\">@Formula(\"(select count(*) from FORMULA_TABLE f where f.price &lt; price)\")  private int cheaperCount;<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 @Formula \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441. Hibernate \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c.\u00a0<\/p>\n<p>select ft1_0.&#187;id&#187;,(select count(*) from FORMULA_TABLE f where f.price &lt; ft1_0.price),ft1_0.&#187;PRICE&#187;,ft1_0.&#187;QUANTITY&#187; from &#171;FORMULA_TABLE&#187; ft1_0\u00a0\u00a0\u00a0<\/p>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Formula \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0441 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f db scpecific-\u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041d\u0443 \u0438 \u043e\u043f\u044f\u0442\u044c \u0436\u0435, SQL-\u043a\u043e\u0434 \u0432 Java.<\/p>\n<h3>Criteria API\u00a0\u00a0<\/h3>\n<p>\u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0421riteria API \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u043e\u043a\u0443 \u00ab\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u00bb. \u0422\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"java\">public interface CustomerRepository extends JpaSpecificationExecutor&lt;Customer> {    }<\/code><\/pre>\n<pre><code class=\"java\">customerRepository.findAll((root, query, cb) -> cb.and(cb.between(root.get(\"id\"), 0L, 100L),  cb.like(root.get(\"name\"), \"%main%\")));<\/code><\/pre>\n<p>\u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c\u0438: root.get(&#171;id&#187;) \u0438 root.get(&#171;name&#187;).\u00a0 \u041f\u0440\u0438\u0447\u0451\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0448\u044c, \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430.\u00a0\u00a0\u00a0\u00a0<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Criteria API \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Metamodel API.\u00a0Metamodel AP \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 Criteria API.\u00a0\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<pre><code class=\"java\">ext {  jpamodelgenVersion = '6.4.4.Final'  }<\/code><\/pre>\n<pre><code class=\"java\">implementation \"org.hibernate:hibernate-jpamodelgen:${jpamodelgenVersion}\"  annotationProcessor \"org.hibernate:hibernate-jpamodelgen:${jpamodelgenVersion}\"<\/code><\/pre>\n<pre><code class=\"java\">sourceSets.main.java.srcDirs += layout.buildDirectory.dir(\"\/generated\")    compileJava {  options.generatedSourceOutputDirectory = layout.buildDirectory.dir(\"\/generated\")  }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, generated, \u0438 \u0442\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438.\u00a0<\/p>\n<p>\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<pre><code class=\"java\">customerRepository.findAll((root, query, cb) -> cb.and(cb.between(root.get(Customer_.id), 0L, 100L),  cb.like(root.get(Customer_.name), \"%main%\")));<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u044f \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438: Customer_.id \u0438 Customer _.name. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439, \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u0443\u043f\u0430\u0434\u0435\u0442 \u0443\u0436\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0410 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e. <\/p>\n<h3>\u0427\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0421riteria API\u00a0<\/h3>\n<p>Criteria API \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0439 \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u0439. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u043e\u043c\u0443 \u043a\u0430\u043a, \u043d\u043e \u043f\u043e \u043c\u043d\u0435 \u043e\u043d \u043a\u043e\u043d\u0442\u0440\u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \ud83d\ude42 \u041d\u0438\u0436\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0431\u043e\u043b\u0435\u0435 \u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414 \u2014 QueryDSL Predicate. \u041f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 gradle \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0411\u0414.\u00a0<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c QueryDSL \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<pre><code class=\"java\">ext {  queryDslVersion = '5.1.0'  }<\/code><\/pre>\n<pre><code class=\"java\">implementation(\"com.querydsl:querydsl-core:${queryDslVersion}\")  implementation(\"com.querydsl:querydsl-jpa:${queryDslVersion}\")  annotationProcessor(\"com.querydsl:querydsl-apt:${queryDslVersion}:jakarta\")<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:\u00a0<\/p>\n<pre><code class=\"java\">public interface CustomerRepository extends QuerydslPredicateExecutor&lt;QCustomer> {    }<\/code><\/pre>\n<pre><code class=\"java\">public void fetchCustomer() {  var customer = QCustomer.customer;   customerRepository.findAll(customer.id.between(1L, 100L).and(customer.name.like(\"%2%\")));  }<\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u042d\u0442\u043e \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438 \u043f\u0440\u043e\u0449\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f.\u00a0<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Query DSL \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u043e\u043f\u0438\u043b\u0438\u043b\u0438 \u0434\u043b\u044f Jakarta. \u041d\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043d\u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0438\u043b\u044f\u0442.<\/p>\n<h2>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h2>\n<p>Spring \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u041d\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0439 Spring. Hibernate, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u043d\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043d\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 Spring. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u0438 Hibernate \u0441\u043e Spring \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e.\u00a0<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0411\u0414 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0441\u043f\u0440\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 PostUpdateEventListener. \u041a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0411\u0414 \u0438 \u0434\u0451\u0440\u0433\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u043b\u043e\u0433.<\/p>\n<pre><code class=\"java\">@Component  @RequiredArgsConstructor  public class HibernateEventListener implements PostUpdateEventListener {    private final LogService logService;    private final EntityManagerFactory entityManagerFactory;    @Override  public void onPostUpdate(PostUpdateEvent event) {      logService.info(\"update entity {} with id {}\", event.getEntity().getClass().getSimpleName(), event.getId());  }    @Override  public boolean requiresPostCommitHandling(EntityPersister persister) {      return false;  }      }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 Hibernate.\u00a0 \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435:<\/p>\n<pre><code class=\"java\">@PostConstruct  public void init() {  SessionFactoryImplementor sessionFactory = entityManagerFactory.unwrap(SessionFactoryImplementor.class);  EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);  registry.getEventListenerGroup(EventType.POST_UPDATE).prependListener(this);  }<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435:\u00a0<\/p>\n<pre><code class=\"java\">@Transactional  public void updateAll() {  customerRepository.findAll().forEach(customer -> {      customer.setName(customer.getName().concat(\" new\"));      customerRepository.saveAndFlush(customer);  });  }<\/code><\/pre>\n<p>\u0412 \u043b\u043e\u0433\u0430\u0445 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Spring:\u00a0<\/p>\n<p>2024-05-01T18:35:50.186+03:00\u00a0 INFO 28520 &#8212; [customer] [ \u00a0 \u00a0 \u00a0 main] c.tander.hibernate.service.LogService: update entity Customer with id 107\u00a0<\/p>\n<p>Hibernate: update &#171;CUSTOMER&#187; set &#171;NAME&#187;=? where &#171;id&#187;=?\u00a0<\/p>\n<p>2024-05-01T18:35:50.187+03:00\u00a0 INFO 28520 &#8212; [customer] [ \u00a0 \u00a0 \u00a0 main] c.tander.hibernate.service.LogService: update entity Customer with id 108\u00a0<\/p>\n<p>Hibernate: update &#171;CUSTOMER&#187; set &#171;NAME&#187;=? where &#171;id&#187;=?\u00a0<\/p>\n<p>2024-05-01T18:35:50.187+03:00\u00a0 INFO 28520 &#8212; [customer] [ \u00a0 \u00a0 \u00a0 main] c.tander.hibernate.service.LogService: update entity Customer with id 109\u00a0<\/p>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u044b \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u044f\u043d\u0430\u043c\u0438. \u041d\u043e, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e \u043c\u043d\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442.\u00a0<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/814573\/\"> https:\/\/habr.com\/ru\/articles\/814573\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Hibernate \u2014 \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 ORM (Object-Relational Mapping) \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u041e\u043d \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u043e\u0433\u0438\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u0442\u044b\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u00ab\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u00bb.\u00a0<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0434\u0440\u0435\u0439 \u0417\u044f\u0431\u043b\u0438\u043d, \u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 Magnit Tech. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0446\u0435\u043f\u0442\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Hibernate \u0438 Spring Data JPA: \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.\u00a0\u00a0<\/p>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\u00a0\u00a0<\/h2>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0420\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u00ab\u0447\u0438\u0441\u0442\u044b\u0439\u00bb JDBC. \u041c\u0438\u043d\u0443\u0441\u044b \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b: \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0411\u0414, \u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u00ab\u0447\u0438\u0441\u0442\u043e\u0433\u043e\u00bb JDBC \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 ORM. \u041e\u0434\u043d\u0430\u043a\u043e Hibernate \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e, \u0430 \u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c \u0438\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Java Stream. \u041f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c Database Undirectional Cursor. \u041f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u00ab\u0447\u0438\u0441\u0442\u043e\u043c\u0443\u00bb JDBC.\u00a0<\/p>\n<p>\u041a\u043e\u0434 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u0421\u00a0 \u043f\u043e\u043c\u043e\u0449\u044c\u044e EntityManager \u0441\u043e\u0437\u0434\u0430\u0435\u043c Query, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 getResultStream \u0432 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e forEach \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u043b\u0438.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = entityManager  .createQuery(\"from BigTable\", BigTable.class)  .getResultStream()) {  bigTableStream.forEach(bigTable -> counter.incrementAndGet());  log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  } <\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434:\u00a0<\/p>\n<p>record fetched 10000000, time spent 12\u00a0<\/p>\n<p>\u0422\u0443\u0442 10 \u043c\u043b\u043d \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u0447\u0438\u0442\u0430\u043d\u043e \u0437\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0438 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442.\u00a0<\/p>\n<p>\u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c JPA-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 Stream, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0451 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">public interface BigTableRepository extends CrudRepository&lt;BigTable, Long> {  @Query(\"select b from BigTable b\")  Stream&lt;BigTable> getAll();    }<\/code><\/pre>\n<pre><code class=\"java\">var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = bigTableRepository.getAll()) {  bigTableStream.forEach(bigTable -> counter.incrementAndGet());  log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0411\u0414 \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Stream API. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Postgres \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0435\u0442\u0447\u0430 \u2014 fetch size. \u042d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 spring.jpa.properties.hibernate.jdbc.fetch_size \u043b\u0438\u0431\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u043a\u043e\u0434\u0435.\u00a0<\/p>\n<p>\u0414\u043b\u044f Hibernate \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a: <\/p>\n<pre><code class=\"java\">public void fetchAllByHibernate() {  var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = entityManager      .createQuery(\"from BigTable\", BigTable.class)      .setHint(AvailableHints.HINT_FETCH_SIZE, 50)      .getResultStream()) {      bigTableStream.forEach(bigTable -> counter.incrementAndGet());      log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  }  }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0435\u0442\u0447\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setHint.\u00a0<\/p>\n<p>\u0414\u043b\u044f Spring JPA \u043a\u043e\u0434 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">public interface BigTableRepository extends CrudRepository&lt;BigTable, Long> {    @QueryHints(      @QueryHint(name = HINT_FETCH_SIZE, value = \"25\")  )  @Query(\"select b from BigTable b\")  Stream&lt;BigTable> getAll();    }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0435\u0442\u0447\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 QueryHints.\u00a0<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0444\u0435\u0442\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f Postgres, MySQL. \u0414\u043b\u044f Oracle \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u043e, \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0438\u043c\u044f\u0442\u0441\u044f \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0435\u0442\u0447\u0430.\u00a0<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0438 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Stream API:\u00a0<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 try-with-resources statement,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 hint fetch size,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 stream.filter, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432 \u0441\u0442\u0440\u0438\u043c\u0430\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0442.\u043f.,<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f OneToMany, ManyToMany.\u00a0<\/p>\n<\/li>\n<\/ul>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Hibernate\u00a0<\/h2>\n<h3>StatelessSession\u00a0<\/h3>\n<p>Hibernate \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0439. \u041d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (dirty checks), \u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f (flushes), \u043a\u044d\u0448 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438 \u0442.\u043f. \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0412 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c StatelessSession.\u00a0\u00a0<\/p>\n<p>StatelessSession \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u044d\u0448 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (dirty checks) \u0438\u043b\u0438 write-behind. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043b\u0435\u043d\u0438\u0432\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u0432\u044f\u0437\u0435\u0439 \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u044d\u0448\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432.\u00a0\u00a0<\/p>\n<p>StatelessSession \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c StreamAPI \u0438 StatelessSession.\u00a0\u00a0\u00a0<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435.\u00a0\u00a0<\/p>\n<pre><code class=\"java\">public void fetchStateless() {  var sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);  var statelessSession = sessionFactory.openStatelessSession();  statelessSession.getTransaction().begin();  var startTime = System.currentTimeMillis();  MutableInteger counter = new MutableInteger(0);  try (var bigTableStream = statelessSession      .createQuery(\"from BigTable\", BigTable.class)      .setHint(AvailableHints.HINT_FETCH_SIZE, 50)      .getResultStream()) {      bigTableStream.forEach(bigTable -> counter.incrementAndGet());      log.info(\"record fetched {}, time spent {} \", counter.get(), (System.currentTimeMillis() - startTime) \/ 1000);  }  statelessSession.getTransaction().commit();  }<\/code><\/pre>\n<p>\u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c SessionFactory, \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 StatelessSession \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0441\u0442\u0440\u0438\u043c\u0438\u043c \u0442\u0430\u043a \u0436\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u043c\u0435\u0442\u043e\u0434 getResultStream.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c:<\/p>\n<pre><code class=\"java\">public void writeStateless() {  var sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);  var statelessSession = sessionFactory.openStatelessSession();  statelessSession.getTransaction().begin();  BigTable record = BigTable.builder().name(\"insert\").build();  statelessSession.insert(record);  record.setName(\"update\");  statelessSession.update(record);  statelessSession.getTransaction().commit();  }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043c \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Insert \u0438 Update. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Hibernate \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442, \u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f dirty checks. \u0415\u0441\u043b\u0438 \u0433\u0440\u0430\u0444 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f dirty checks \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u043e\u0438\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u043e, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0430\u0441\u0442\u0438.\u00a0<\/p>\n<h3>Batch Insert\/Update<\/h3>\n<p>\u0410 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u0449\u0451 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c\u0441\u044f? \u0410 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \ud83d\ude42 \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">public void insertStateless() {  var sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);  var statelessSession = sessionFactory.openStatelessSession();  statelessSession.setJdbcBatchSize(7);  statelessSession.getTransaction().begin();  for (long i = 1; i &lt;= 100; i++) {      BigTable record = BigTable.builder().name(\"value\" + i).build();      statelessSession.insert(record);  }  statelessSession.getTransaction().commit();  } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435.\u00a0\u00a0<\/p>\n<pre><code class=\"java\">statelessSession.setJdbcBatchSize(7);<\/code><\/pre>\n<p>\u0412 \u043b\u043e\u0433\u0430\u0445 \u0432\u0438\u0434\u0438\u043c:\u00a0<\/p>\n<p>Type:Prepared, Batch:True, QuerySize:1, BatchSize:7\u00a0<\/p>\n<p>Query:[&#171;insert into &#171;BIG_TABLE&#187; (&#171;NAME&#187;,&#187;id&#187;) values (?,?)&#187;]\u00a0<\/p>\n<p>Params:[(value92,102),(value93,103),(value94,104),(value95,105),(value96,106),(value97,107),(value98,108)]\u00a0<\/p>\n<p>\u00a0\u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e:\u00a0<\/p>\n<pre><code class=\"java\">spring:    jpa:  properties:    hibernate:      order_inserts: true      jdbc.batch_size: 7<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438\/\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430 \u0441\u0447\u0451\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0411\u0414.\u00a0<\/p>\n<p>\u0415\u0449\u0451 \u0437\u0434\u0435\u0441\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u044f order_inserts (\u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f order_updates) \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.\u00a0<\/p>\n<p>\u0414\u0430, \u0442\u0430\u043a\u0438\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043b\u043e\u0433\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e net.ttddyy:datasource-proxy.\u00a0<\/p>\n<h3>DynamicUpdate\u00a0<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, Hibernate \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b SQL \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 CRUD \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u042d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 SQL \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SQL-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.\u00a0\u00a0<\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u043e\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0439 \u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043b\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, LOB). \u0420\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 @DynamicUpdate. \u0415\u0441\u043b\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439, Hibernate \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SQL: \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 SQL \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u043e \u043f\u043b\u044e\u0441 \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SQL \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\u00a0<\/p>\n<pre><code class=\"java\">@Entity  @Table(name = \"DYNAMIC_TABLE\")  @DynamicUpdate  public class DynamicTable {<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, Hibernate \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0435\u0447\u044c \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u043c. \u0418\u043b\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0438\u043b\u0438 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b. \u041e\u0431\u044b\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043e\u0440\u043e\u0433\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u0431\u044f \u043e\u043f\u0440\u0430\u0432\u0434\u044b\u0432\u0430\u0435\u0442.\u00a0\u00a0<\/p>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u0438\u00a0\u00a0<\/h3>\n<p>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u043f\u043e\u0434\u043e\u0431\u043d\u043e @DynamicUpdate, \u0442\u043e\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.\u00a0\u00a0<\/p>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0442<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-376229","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/376229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=376229"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/376229\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=376229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=376229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=376229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}