Найти по разным свойствам на нескольких подклассах - PullRequest
1 голос
/ 05 июля 2011

У меня есть 3 сущности Agent, Person и Machine

abstract Agent
  Long id

Person extends Agent
  String firstName
  String lastName

Machine extends Agent
   String label

Я искал решение для запроса всех моих агентов по заданному параметру "name", который будет искать по firstName и lastName из Person или по метке Machine.

Возможно ли это с помощью запроса jpql?

Спасибо

1 Ответ

1 голос
/ 23 марта 2016

Я немного опоздал, но, поскольку querydsl 3.6.2 (который исправил использование instanceOf), вы можете сделать это с помощью кода Java.

BooleanBuilder builder = new BooleanBuilder();
QAgent qAgent = QAgent.Agent;
builder.or(qAgent.as(QPerson.class).firstName.eq("someFirstName")
.and(qAgent.instanceOf(Person.class));

builder.or(qAgent.as(QMachine.class).label.eq("someLabel")
.and(qAgent.instanceOf(Machine.class));

Page<Agent> agentsPage = agentRepository.findAll(builder);

С другой стороны, я бы пересмотрел вашу структуру классов, это приведет к запросам объединения, если вы могли бы использовать проекцию с общими свойствами для суперкласса, возможно, результирующий запрос будет дешевле.

...