Как получить сущность через JPA @Query, если связанная сущность равна нулю?

#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();  

Спасибо за вашу помощь!