Как запросить сущность OneToOne для определенного значения с CriteriaQuery - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть объект (Person), который является OneToOne для другого объекта (пользователя).Мне нужно найти все сущности Person, которые соответствуют User.name, используя CriteriaQuery.

Я могу просто сделать простой CriteriaQuery для прямых атрибутов Person:

builder.like(builder.lower(root.get(column)), "%" + pattern.toLowerCase() + "%")

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

@Entity()
public class Person extends ModelCore {
    @Basic()
    private String iD = null;
    @OneToOne(cascade = { CascadeType.ALL })
    @JoinColumns({ @JoinColumn(name = "T_User") })
    private User user = null;
}

@Entity()
public class User extends ModelCore {
    @Basic()
    private String iD = null;
    @Basic()
    private String name = null;
}

@Entity()
public class ModelCore{
    @Basic()
    private Long dbID = null;
}

решено

Решение Nikos прекрасно работает (спасибоВы!):

String username = ... // the criterion
EntityManager em = ...
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Join<Person, User> joinUser = root.join("user"); 
query.where(cb.like(cb.lower(joinUser.get("name")), "%" + username.toLowerCase() + "%"));

Редактировать 1: Добавлен ModelCore в качестве базового класса.Редактировать 2: Добавить рабочий раствор

1 Ответ

0 голосов
/ 28 декабря 2018

Критерии API могут вводить в заблуждение по мере роста сложности.Первый шаг, который я всегда выполняю, это записать JPQL-запрос.В этом случае:

SELECT p
FROM Person p
  JOIN User u
WHERE LOWER(u.name) LIKE :username

Преобразование этого в Criteria API:1007 * становится cb.like(x, y)), но отображение простое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...