Добавить оператор PARTITION для запроса при использовании данных Spring JPA - PullRequest
0 голосов
/ 17 июня 2020

возьмите пример из приведенного ниже SQL запроса

SELECT * FROM employee PARTITION (p0) WHERE name = 'John';

Приведенный выше пример может легко писать без «РАЗДЕЛЕНИЯ (p0)» в данных Spring JPA. Когда мне нужно добавить раздел, становится очень сложно.

Одно из возможных решений - использовать собственный SQL. Но для меня это не вариант, потому что я должен использовать PaginationAndSorting и Criteriabuilder. Любые предложения были бы замечательными. Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Наконец-то я нашел способ сделать это.

Необходимо создать перехватчик, чтобы перехватывать все SQL запросы и редактировать его в соответствии с требованиями.

@Component
public class MyInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = 1;
    @Autowired
    @Qualifier("PartitionContext")
    private ThreadLocal<String> partitionContext;

    @Override
    public String onPrepareStatement(String sql) {
        String partition = partitionContext.get();
        if (partition != null) {
            StringBuilder sb = new StringBuilder(sql);
            sql = sb.insert(sql.indexOf(" where"), partition).toString();
            partitionContext.remove();
        }
        return super.onPrepareStatement(sql);
    }
}

Нам также необходимо зарегистрируйте перехватчик вот так.

Component
public class MyInterceptorRegistration implements HibernatePropertiesCustomizer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put("hibernate.session_factory.interceptor", myInterceptor);
    }
}
0 голосов
/ 17 июня 2020

Вы не можете сделать это с помощью Criteria API, поскольку он в основном создает JPQL, поэтому предложение раздела является частью SQL, и в JPQL нет эквивалента.

Поскольку вам кажется, что вам нужно создать запрашивать динамически Я предлагаю вам изучить Querydsl и jOOQ, чтобы узнать, поддерживают ли они предложение раздела, или, в качестве альтернативы, самостоятельно создайте SQL, используя конкатенацию строк. В этом случае вы должны позаботиться о том, чтобы не создать уязвимость SQL инъекций.

Если все, что вам нужно, это разбиение на страницы, это можно прекрасно сочетать с собственными аннотациями @Query.

...