#spring #spring-boot #hibernate #jpa
Вопрос:
Я столкнулся с проблемой, которую не смог решить. В настоящее время я работаю над очень простым приложением для НЛП в качестве домашнего проекта. Это работает следующим образом: я отправляю в качестве ввода текст. Приложение пытается найти словосочетание для отдельных слов в этом тексте. В случае отсутствия совпадающего слова stem он устанавливает столбец в таблице, связанный с объектом LemmaType, как null, а также недопустимое логическое поле в значение true. Другой (плохой) случай-это когда он находит два или более совпадающих словосочетания, затем он устанавливает недопустимое поле в значение true, а столбец Lemmatype в значение первого совпадающего словосочетания из таблицы LemmaType. Сейчас я пишу функцию, которая пытается получить все записи из таблицы TextToken, где недопустимое поле равно true, и возвращает пустой набор, хотя есть объекты, которые являются недопустимыми. Я использую проекцию (InvalidLemmasDTO) для приобретения сущностей.
Мои сущности следующие (упрощенные):
@Entity @Table(name = "lemmatypes") @Where(clause = "deleted=0") @Builder public class LemmaType implements Comparablelt;LemmaTypegt; { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(columnDefinition = "varchar(50)") private String text; private boolean deleted; @OneToMany(mappedBy = "lemmaType", cascade = {CascadeType.MERGE, CascadeType.PERSIST}) private Listlt;TextTokengt; textTokens = new ArrayListlt;gt;(); // constructors and getters and setters
@Entity @Table(name = "texttokens") @Where(clause = "deleted=0") @Builder public class TextToken { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(columnDefinition = "varchar(50)") private String text; @Column(columnDefinition = "varchar(8)") private String phraseType; @Column(columnDefinition = "smallint default 0") private short sentencePosition = 1; // it has an associated sentence object as well private boolean deleted; private boolean invalid; @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) private LemmaType lemmaType; @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) private Sentence sentence; // constructors and getters and setters
public interface InvalidLemmasDTO { String getTokenText(); String getSentenceText(); String getLemmaTypeText(); }
This is the query that doesn’t work. (If I set the invalid = false then it returns all the necessary objects)
@Query("SELECT tt.text as tokenText, tt.sentence.text as sentenceText, " "CASE WHEN (tt.lemmaType IS NOT NULL) THEN tt.lemmaType.text ELSE 'no lemmatype provided' END as lemmaTypeText " "FROM TextToken tt WHERE tt.invalid = TRUE") Setlt;InvalidLemmasDTOgt; getInvalidLemmas();
I tried the other way as well, checking for null, but still no success
@Query("SELECT tt.text as tokenText, tt.sentence.text as sentenceText, " "CASE WHEN (tt.lemmaType IS NULL) THEN 'no lemmatype provided' ELSE tt.lemmaType.text END as lemmaTypeText " "FROM TextToken tt WHERE tt.invalid = TRUE") Setlt;InvalidLemmasDTOgt; getInvalidLemmas();
Я думаю, что, возможно, это должно быть связано с JPA и CASE-WHEN, потому что, если я выполняю следующий запрос, он возвращает все недопустимые объекты:
@Query("SELECT tt from TextToken tt where tt.invalid = true") Setlt;TextTokengt; getTextTokensInvalid();
Спасибо за вашу помощь!