Java Criteria API: выберите поле @ ElementCollection / @ JoinTable в множественном выборе - PullRequest
0 голосов
/ 19 марта 2020

У меня есть простая ситуация: таблица / сущность OrganizationContact и таблица сопоставления OrganizationContactType.

Таким образом, контакт может иметь один или несколько типов, например, контакт может быть ПОСТАВЩИКОМ или ЗАКАЗЧИК или оба.

Ниже сущности OrganizationContact:

@Entity
@Table(name = "FDE_ORGANIZATION_CONTACT")
public class OrganizationContact {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 200, nullable = false)
    private String name;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "organization_id", nullable = false)
    private Organization organization;

    @ElementCollection
    @Enumerated(EnumType.STRING)
    @JoinTable(
        name = "FDE_ORGANIZATION_CONTACT_TYPE",
        joinColumns = {@JoinColumn(name = "org_contact_id", referencedColumnName = "id")})
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @Column(name = "contact_type")
    private Set<ContactTypeEnum> types = new HashSet<>();

    public OrganizationContact() {}

    public OrganizationContact(Long id, Set<ContactTypeEnum> types) {
        this.id = id;
        this.types = types;
    }

В моем запросе мне нужно выбрать только id и набор types. Ниже запроса:

public List<OrganizationContact> findAllContacts() {

        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<OrganizationContact> cq = cb.createQuery(OrganizationContact.class);
        Root<OrganizationContact> root = cq.from(OrganizationContact.class);

        // JOIN TESTS
        // Join<OrganizationContact, Set<ContactTypeEnum>> join = root.join("types");
        // Join<OrganizationContact, ContactTypeEnum> join = root.join("types");
        // JoinSet<OrganizationContact, ContactTypeEnum> join = root.joinSet("types");

        cq.multiselect(
                root.get(OrganizationContact_.id),

                // MY DIFFICULT IS HERE
                // SELECT TESTS
                // root.get("types")
                // join
        );
        cq.distinct(true);

        TypedQuery<OrganizationContact> typedQuery = em.createQuery(cq);
        return typedQuery.getResultList();
    }

Мне сложно понять метод выбора Set. Для каждого идентификатора контакта мне нужен набор типов.

Если я посмотрю запрос Hibernate, я увижу:

select distinct organizati0_.id as col_0_0_, . as col_1_0_ from ......

Проблема здесь:

. as col_1_0_

Hibernate не может выбрать столбец (до точки).

Есть предложения?

Большое спасибо

...