Мне нужно запросить базу данных с пользовательским вводом. Мое приложение запрашивает у пользователя заголовок и описание и сохраняет его в таблице сценариев использования. Я хочу использовать ввод заголовка, для которого в заголовке таблицы задано значение title, для запроса другой таблицы с именем apdb, чтобы вернуть поле смягчения записи, которая имеет этот заголовок либо в поле имени, либо в поле описания, где также поле likelihood_of_attack и поле typ_severity содержат строку «High». Например: пользователь вводит «логин» в качестве заголовка, поэтому в моей таблице apdb будет выполняться поиск строки «логин» для записи, которая имеет термин «логин» в столбце «имя» или «описание» с поля liklihood_of_attack 'и' typical_severity ', содержащие строку «High» и возвращающие поле «mitigation» этой записи в таблицу прецедентов в поле «mitigation». Для начала у меня есть эта таблица с именем apdb:
CREATE TABLE apdb(
ID INTEGER NOT NULL PRIMARY KEY
,Abstraction VARCHAR(8) NOT NULL
,Status VARCHAR(6) NOT NULL
,Description text
,Liklihood_Of_Attack VARCHAR(6) NOT NULL
,Typical_Severity VARCHAR(6) NOT NULL
);
И эта сущность, которая создает прецедент таблицы для хранения ввода пользователя, и результат запроса будет установлен как «смягчение».
@Entity
@Table(name="usecase")
public class UseCase {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
private String content;
private Date updated;
private String mitigation;
public UseCase() {
super();
// TODO Auto-generated constructor stub
}
public UseCase(String title, String content, Date updated, String mitigation) {
super();
this.title = title;
this.content = content;
this.updated = updated;
this.mitigation = mitigation;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getMitigation() {
return mitigation;
}
public void setMitigation(String mitigation) {
this.mitigation = mitigation;
}
public Date getUpdated() {
return updated;
}
public void setUpdated(Date updated) {
this.updated = updated;
}
}
И у меня есть этот mySQL запрос
SELECT * FROM apdb WHERE CONCAT(Name, '', Description, '') LIKE "%login%";
SELECT Mitigations FROM apdb u WHERE u.Likelihood_Of_Attack = "High" && u.Typical_Severity = "High";
Теперь вот где у меня проблема, я не знаю, куда поместить @Query, и я не знаю, как запросить базу данных с переменной заголовка. Я предполагаю, что @Query входит в репозиторий, но я не уверен, стоит ли мне использовать репозиторий usecase или apdb. Как мне сделать запрос к базе данных с параметром title и сохранить результат в моей таблице вариантов использования? Название и описание моего сценария ввода вводятся пользователем в форме в файле html, они устанавливаются в контроллере с помощью метода save и отображаются с помощью метода show, например:
`
@RequestMapping("/usecases/save")
public String save(@RequestParam String title, @RequestParam String content /*, @RequestParam String mitigation*/) {
UseCase usecase = new UseCase();
usecase.setTitle(title);
usecase.setContent(content);
//usecase.setMitigation(mitigation);
usecase.setUpdated(new Date());
useCaseRepository.save(usecase);
return "redirect:/usecases/show/" + usecase.getId();
}
`
В моем запросе вы можете видеть, что я на самом деле запрашиваю базу данных со строкой "login", но я хочу запросить ее с помощью параметра title, предоставленного параметром пользователь. У меня есть сущность для usecase и apdb, а также соответствующие им JpaRepository. Я экспериментирую с моим UseCaseRepository следующим образом ...
public interface UseCaseRepository extends JpaRepository<UseCase, Long> {
ApdbRepository findByMitigation(final String mitigation);
Apdb findByTitle(final String title);
//UseCase findByTitle(final String title);
@Query(value = "SELECT * FROM apdb WHERE CONCAT(Name, '', Description, '') LIKE \"%usecase.getTitle()%\";\n" +
"SELECT Mitigations FROM apdb u WHERE u.Likelihood_Of_Attack = \"High\" && u.Typical_Severity = \"High\";"
)
//List<Apdb> findByTitle(@Param("$1") String searchTerm);
List<UseCase> findBySearchTermNative(@Param("login") String searchTerm);
}
Конечно, это не работает. Должен ли я запрашивать таблицу apdb? Или это имеет значение? Если да, как вставить результат запроса в таблицу вариантов использования для поля смягчения? Как вы, ребята, думаете, что я должен go сделать это? Если вы посоветуете мне, как поступить, я был бы очень благодарен. Похоже, я не могу найти много учебных пособий по этому вопросу, которые имеют отношение к тому, что я пытаюсь сделать, или я просто не ищу нужную вещь. Я просто изучаю Spring и JPA, прости мое невежество. Это только для образовательных целей, поэтому я не очень беспокоюсь о безопасности.