Как запросить все записи, где "b MEMBER OF a.list" - PullRequest
0 голосов
/ 26 мая 2018

У меня есть сущность, скажем, A, которая имеет поле, представляющее собой список другой сущности, скажем, B.

Это A:

@Entity
@Table(name = "a")
public class A implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "a_b",
               joinColumns = @JoinColumn(name="as_id", referencedColumnName="id"),
               inverseJoinColumns = @JoinColumn(name="bs_id", referencedColumnName="id"))
    private Set<B> bs = new HashSet<>();
}

Это B:

@Entity
@Table(name = "b")
public class B implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "description")
    private String description;
}

Теперь я пытаюсь добиться того, чтобы иметь возможность запрашивать все записи a из A, имея сущность b из B в a.bs

Thaфактический запрос показан ниже:

@Repository
public interface ARepository extends JpaRepository<A, Long> {
    @Query("SELECT DISTINCT a FROM A a LEFT JOIN FETCH a.bs bs WHERE :b MEMBER OF bs")
    List<A> findAllByB(@Param("b") B b);
}

Разве это не должно работать так?

Однако я получаю следующую ошибку, я положил ее на pastebin из-за превышенияРазмеры поста:

Журнал

1 Ответ

0 голосов
/ 26 мая 2018

Я думаю, вам не нужно join здесь.

Попробуйте этот запрос:

@Query("SELECT DISTINCT a FROM A a WHERE :b MEMBER OF a.bs")

Вы используете оператор MEMBER OF, но сопоставьте его с другой таблицей, а несама коллекция, что приводит к ошибке синтаксиса sql.

По умолчанию PostgreSQL создайте схему public, если вы не укажете схему для вашей сущности, она не будет найдена при проверке гибернации по общедоступнойсхема.

@Table(name = "b", schema = "schemaname")
...