@ База данных запросов с пользовательским вводом Spring JPA MySQL - PullRequest
0 голосов
/ 27 апреля 2020

Мне нужно запросить базу данных с пользовательским вводом. Мое приложение запрашивает у пользователя заголовок и описание и сохраняет его в таблице сценариев использования. Я хочу использовать ввод заголовка, для которого в заголовке таблицы задано значение 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, прости мое невежество. Это только для образовательных целей, поэтому я не очень беспокоюсь о безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...