2011-07-05 29 views
1

我有3個實體AgentPersonMachine查找多子類不同性質

abstract Agent 
    Long id 

Person extends Agent 
    String firstName 
    String lastName 

Machine extends Agent 
    String label 

我尋找一個解決方案來詢問我對給定參數"name",這將查找在firstNamePersonlastName所有代理或者標籤Machine

它可能與一個jpql查詢?

感謝

+0

您可以向代理添加一個抽象方法getName(),它返回適合該類型的名稱嗎? –

+0

是的,我可以更新代理類,但如何在jpa查詢中使用此方法? – jfasrc

+0

像其他任何JavaBean一樣。我假設JPA使用getters而不是基礎字段。 –

回答

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); 

不利的一面,我會重新考慮你的類結構,這將導致在聯合查詢,如果你可以用與超共同特性的投影可能產生的查詢會更便宜。