Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找多个子类上的不同属性_Java_Jpa_Jpql_Querydsl - Fatal编程技术网

Java 查找多个子类上的不同属性

Java 查找多个子类上的不同属性,java,jpa,jpql,querydsl,Java,Jpa,Jpql,Querydsl,我有3个实体代理,人和机器 abstract Agent Long id Person extends Agent String firstName String lastName Machine extends Agent String label 我搜索了一个解决方案来查询给定参数“name”上的所有代理,该参数将查找个人的名字和姓氏,或机器的标签 是否可以使用jpql查询 谢谢我有点晚了,但是自从querydsl 3.6.2(它更正了instanceOf的使用)以来

我有3个实体
代理
机器

abstract Agent
  Long id

Person extends Agent
  String firstName
  String lastName

Machine extends Agent
   String label
我搜索了一个解决方案来查询给定参数
“name”
上的所有代理,该参数将查找
个人的
名字和
姓氏,或
机器的标签

是否可以使用jpql查询


谢谢

我有点晚了,但是自从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);
BooleanBuilder=newbooleanbuilder();
QAgent QAgent=QAgent.Agent;
builder.or(qAgent.as(QPerson.class).firstName.eq(“someFirstName”)
和(qAgent.instanceOf(Person.class));
builder.or(qAgent.as(QMachine.class).label.eq(“someLabel”)
和(qAgent.instanceOf(Machine.class));
Page agentsPage=agentRepository.findAll(生成器);

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

您可以向代理添加抽象方法getName()吗它返回适合该类型的名称?是的,我可以更新代理类,但如何在jpa查询中使用此方法?与任何其他JavaBean一样。我假设jpa使用getter而不是底层字段。感谢您的帮助,但我发现了一个类似sql的解决方案
从代理a、人员p、机器m中选择a,其中(p.id=g.id和(p.lastName like:name或p.firstName like:name)或(ma.id=g.id和ma.name like:name)
如果您希望能够匹配名字或姓氏,这将最有效。