У меня есть объект (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: Добавить рабочий раствор