Конвертер JPA с содержащим запрос

У меня возникли проблемы с определенным запросом в моем приложении Spring Boot. Я использую встроенное шифрование текста Spring для шифрования текста в моей базе данных.

У меня есть объект под названием BookRecord

@Entity
@Table(name = "books")
@EntityListeners(AuditingEntityListener.class)
public class BookRecord extends Auditable {

@EmbeddedId
private BookIdentifier identifier;

@Column(name = "title")
@Convert(converter = TitleEncryptionConverter.class)
private String title;

И конвертер шифрования заголовков, который выглядит так

public class TitleEncryptionConverter implements AttributeConverter<String, String> {
    private TextEncryptor textEncryptor;

    public TitleEncryptionConverter (TextEncryptor textEncryptor) {
        this.textEncryptor = textEncryptor;
    }

    @Override
    public String convertToDatabaseColumn(String attribute) {
        return textEncryptor.encrypt(attribute);
    }

    @Override
    public String convertToEntityAttribute(String dbData) {
        return textEncryptor.decrypt(dbData);
       }
    }

Я пытаюсь выполнить поиск в базе данных, используя «содержит» в заголовке, однако, поскольку заголовок зашифрован, у меня возникают проблемы с получением правильных результатов. Вот мой запрос:

Page<BookRecord> findByIdentifier_UserIdAndTitleContains(String uid, String searchTerm,  Pageable pageable);

Я пытаюсь написать конечную точку, которая будет запрашивать базу данных и искать заголовки, содержащие определенные символы. Поскольку заголовки зашифрованы в базе данных, запрос не возвращает совпадений (он ищет базу данных с зашифрованным значением «searchTerm».

Как мне справиться с этим? Я думаю, что мои варианты:

  1. Выясните, как не шифровать searchTerm перед поиском в базе данных, и попробуйте расшифровать результаты db перед запуском содержимого.
  2. Найдите все элементы в базе данных только по user_id, а затем вручную отфильтруйте заголовки с помощью searchTerm (поскольку BookRecord уже будет иметь расшифрованные значения, это должно работать. Недостатком этого является пейджинг).

Любые предложения, как я могу решить эту проблему?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
498
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это сложная тема. Поскольку вы не можете использовать индексы из-за того, что данные зашифрованы, вы мало что можете сделать, кроме как загрузить данные и каким-то образом отфильтровать их. Если вы сможете реализовать расшифровку в базе данных, вы, по крайней мере, сможете избежать передачи ненужных данных, но производительность все равно будет плохой, если кардинальность на user_id очень высока.

к сожалению, я думаю, что нет другого способа, кроме как загрузить данные, а затем отфильтровать их на стороне java. Спасибо за ответ

gd000 23.12.2020 17:09

Удивительно, но можно искать зашифрованные данные, не расшифровывая их: https://www.mongodb.com/blog/post/mongodb-releases-queryable-encryption-preview

Не знаю ни одной реляционной базы данных, которая делает что-то подобное, и, конечно же, нет никакой интеграции с JPA.

Если мое понимание того, как работает JPA, неверно, я думаю, что это может работать с JPA, поскольку драйвер MongoDB выполняет шифрование/дешифрование. Насколько я знаю, JPA генерирует запрос и отправляет его через драйвер в базу данных. Это означало бы, что драйвер, безусловно, должен иметь возможность использовать encryption preview (после реализации), чтобы он работал с JPA. Но, как вы сказали, MongoDB кажется единственным

XtremeBaumer 15.07.2022 09:49

Я не думаю, что существует реализация JPA, которая работает с MongoDB.

Jens Schauder 15.07.2022 10:12

Кажется, это зависит от того, что мы определяем как «работает». Кажется, есть некоторая поддержка JPA для MongoDB, но не на 100%, поскольку они говорят, что MongoDB основан на документах, а JPA в основном требует реляционных баз данных.

XtremeBaumer 15.07.2022 10:20

Другие вопросы по теме