JPA findby для фильтрации дочернего списка строк - PullRequest
0 голосов
/ 17 апреля 2020

Итак, я знаю, что могу фильтровать

  • указанное c свойство в JPA с findByProperty.
  • и свойство класса в наборе (атрибут: classset в родительском элементе) с findByClassset_Property

Но как я могу фильтровать, если у меня есть набор строк? Я не могу использовать _Property для набора строк, поскольку строки не имеют свойства?

Допустим, у меня есть следующая сущность:

@Entity(name = "mine")
public class MyEntity extends AbstractBaseEntity {

    @Column(name = "something")
    private String something;

    @ElementCollection (fetch = FetchType.EAGER)
    private Set<Anotherclass> colorlist;

    @ElementCollection (fetch = FetchType.EAGER)
    private Set<String> mylist;

}

И еще один класс с атрибутом String:

public class Anotherclass  {

     String color;

}

А вот мой репозиторий:

@Repository
public interface MyEntityRepository extends JpaRepository<RisikoEntity, Long> {

    List<MyEntity> findBySomethingContainsIgnoreCase(String filterstring); // works as expected

    List<MyEntity> findByColorlist_ColorIgnoreCase(String filterstring); // works as expected

    List<MyEntity> findByMylistContainsIgnoreCase(String filterstring); // does not work - returns no matches

}

1 Ответ

0 голосов
/ 17 апреля 2020

Итак, как мне объяснили в Java чате -

в реляционных или табличных базах данных, коллекция примитивов не существует. Массивы, карты, множества, деревья и т. Д. c не существуют как значения, единственное, что существует, - это наборы сущностей, и эти сущности могут иметь один строковый столбец. Но вам придется создать сущность, определяющую этот столбец

Так что это либо создание сущности с одним столбцом, содержащим строку, а затем фильтрация этого (точно так же, как я уже делал с классом Anotherclass с свойство единственной строки color сверху).

Или используя @Query следующим образом:

@Query (value = "SELECT * from myentity e " +
" left join myentity_mylist l ON e.id = l.myentity_id " +
" WHERE lower(l.mylist) LIKE CONCAT('%',:filtertext,'%')  ", nativeQuery = true)
List<MyEntity> findbyCustomFiltering(@Param("filtertext") String filterstring_lowercase);
...