Java 查找多个子类上的不同属性
我有3个实体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的使用)以来
代理
,人
和机器
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)
如果您希望能够匹配名字或姓氏,这将最有效。