Использование hibernate CriteriaQuery для сущности с идентификатором ref для другой сущности таблицы - PullRequest
0 голосов
/ 18 марта 2019

У меня сложный (для меня) запрос гибернации, который я пытаюсь выяснить, и моя голова просто не может понять, как это сделать.

Мне нужно найти все объекты Устройства, которые имеютEntityRegistration.userName = ~ "foo".

Классы сущностей:

@Entity()
@Table
public class Device {
    @Basic()
    @Column(name = "HostName")
    private String hostName = null;
    @Basic()
    @Column(name = "RegistrationID")
    private String registrationID = null;
}
@Entity()
@Table
public class EntityRegistration {
    @Basic()
    @Column(name = "ID")
    private String iD = null;
    @Basic()
    @Column(name = "UserName")
    private String userName = null;
}

Device.registrationID сопоставляется с EntityRegistration.iD.Я не хочу изменять таблицу, чтобы EntityRegistration в качестве ссылки OneToMany.

Вот что я пробовал на основе похожих запросов, где вместо базового типа есть ссылка OneToMany, как в этом случае:

CriteriaBuilder builder = context.getBuilder();
Root<Device> root = context.getRoot();
Join<Device,EntityRegistration> joinReg = root.join("registrationID");
builder.lower(joinReg.get("id")), userName);

Я понимаю, почему этот код не работает, но я не могу понять, как правильно написать запрос для этого случая, когда у меня есть ссылка на идентификатор.

1 Ответ

0 голосов
/ 22 марта 2019

Ваш фрагмент кода на самом деле соответствует критериям JPA, что соответствует стандарту JPA.

Стандарт JPA не предлагает решения для объединения не связанных между собой объектов.См. Статью от эксперта Hibernate: Влад Михалча

Это возможно ТОЛЬКО с использованием Hibernate QUERY:

TypedQuery<Device> q = em.createQuery(
"select d from Device d JOIN EntityRegistration e ON d.registrationID=e.id AND e.userName=?1", Device.class);
q.setParameter(1, "peter")
q.getResultList();
...