【问题标题】:Find on different properties on multi subclass查找多子类的不同属性
【发布时间】:2011-09-28 15:30:41
【问题描述】:

我有 3 个实体 AgentPersonMachine

abstract Agent
  Long id

Person extends Agent
  String firstName
  String lastName

Machine extends Agent
   String label

我搜索了一种解决方案,以在给定参数 "name" 上查询我的所有代理,这将在 PersonfirstNamelastNameMachine 的标签上查找。

jpql 查询可以吗?

谢谢

【问题讨论】:

  • 你能向 Agent 添加一个抽象方法 getName() 来返回适合类型的名称吗?
  • 是的,我可以更新代理类,但是我如何在 jpa 查询中使用这个方法?
  • 像任何其他 JavaBean 一样。我假设 JPA 使用 getter 而不是底层字段。
  • 感谢您的帮助,但我找到了“类似 sql”的解决方案 select a from Agent a, Person p, Machine m where (p.id = g.id and (p.lastName like :name or p.firstName like :name) or (ma.id = g.id and ma.name like :name)
  • 如果您希望能够匹配名字或姓氏,这将最有效。

标签: java jpa jpql querydsl


【解决方案1】:

我有点晚了,但由于 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);

不利的一面是,我会重新考虑您的类结构,这将导致联合查询,如果您可以在超类上使用具有公共属性的投影,那么生成的查询可能会更便宜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多