У меня возникли проблемы с определенным запросом в моем приложении 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».
Как мне справиться с этим? Я думаю, что мои варианты:
Любые предложения, как я могу решить эту проблему?




Это сложная тема. Поскольку вы не можете использовать индексы из-за того, что данные зашифрованы, вы мало что можете сделать, кроме как загрузить данные и каким-то образом отфильтровать их. Если вы сможете реализовать расшифровку в базе данных, вы, по крайней мере, сможете избежать передачи ненужных данных, но производительность все равно будет плохой, если кардинальность на user_id очень высока.
Удивительно, но можно искать зашифрованные данные, не расшифровывая их: https://www.mongodb.com/blog/post/mongodb-releases-queryable-encryption-preview
Не знаю ни одной реляционной базы данных, которая делает что-то подобное, и, конечно же, нет никакой интеграции с JPA.
Если мое понимание того, как работает JPA, неверно, я думаю, что это может работать с JPA, поскольку драйвер MongoDB выполняет шифрование/дешифрование. Насколько я знаю, JPA генерирует запрос и отправляет его через драйвер в базу данных. Это означало бы, что драйвер, безусловно, должен иметь возможность использовать encryption preview (после реализации), чтобы он работал с JPA. Но, как вы сказали, MongoDB кажется единственным
Я не думаю, что существует реализация JPA, которая работает с MongoDB.
Кажется, это зависит от того, что мы определяем как «работает». Кажется, есть некоторая поддержка JPA для MongoDB, но не на 100%, поскольку они говорят, что MongoDB основан на документах, а JPA в основном требует реляционных баз данных.
к сожалению, я думаю, что нет другого способа, кроме как загрузить данные, а затем отфильтровать их на стороне java. Спасибо за ответ