簡體   English   中英

帶連接的Querydsl實體繼承查詢

[英]Querydsl entity inheritance query with join

我有三個實體。 用戶(父母)

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "user_type")
@Table(name = "userinfo")
@SequenceGenerator(name = "userInfoUserIdSeq", initialValue = 1, allocationSize = 100, sequenceName = "userinfo_user_id_seq")
public abstract class UserInfo {

public static final String EDITOR = "E";
public static final String TALENT = "T";

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userInfoUserIdSeq")
@Column(name = "user_id")
private Long id;
...

編輯(子)

@Entity
@DiscriminatorValue(UserInfo.EDITOR)
@Table(name = "editors")
public class Editor extends UserInfo { ....

記者(兒童)

@Entity
@DiscriminatorValue(UserInfo.TALENT)
@Table(name = "talent")
public class Talent extends UserInfo { .....

我有以下查詢不起作用,寫在querydsl上

    QUserInfo userInfo = QUserInfo.userInfo;
    text = "%"  + text + "%";
    QTalent talent = QTalent.talent;
    QEditor editor = QEditor.editor;
    SearchResults<UserInfo> results = query.from(userInfo).leftJoin(userInfo, talent._super)
            .leftJoin(userInfo, editor._super).where( .....

我有以下堆棧跟蹤:

     at            com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:127)
    at com.mysema.query.jpa.impl.AbstractJPAQuery.listResults(AbstractJPAQuery.java:261)
    at com.washpost.talent.dao.implementation.UserInfoDaoImpl.findAllUsersByNamesAndEmails(UserInfoDaoImpl.java:33)
    ... 113 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select count(userInfo)
from com.washpost.talent.model.UserInfo userInfo
  left join treat(userInfo as Talent) as talent
  left join treat(userInfo as Editor) as editor
where ....

我不明白為什么我的加入無效

不能不完整地查詢就不能說。

但是通常您不會加入JPA中的繼承表。 如果要所有用戶(包括記者,編輯...),只需運行“ Select U from User u

如果只需要新聞工作者,則可以查詢: select u From Journalist U

JPA將在需要時將其轉換為聯接(以便您可以將繼承類型更改為單個表,並且查詢仍然可以使用)

在JPQL中,您可以像嘗試那樣連接屬性,但不能連接鑒別表。 但是,如果您可以描述所需的信息,將很有幫助。

不必進行左連接。 正如您已經完成了類“ @Inheritance(strategy = InheritanceType.JOINED)”中的映射一樣。 因此,當您進行查詢時,將使用以下方式自動完成連接:

        UserInfo userInfo = new UserInfo ("userInfo");
        QTalent talent = userInfo.as(QTalent.class);
        QEditor editor = userInfo.as(QEditor.class);

有關繼承的文檔

參考:簡單示例QueryDsl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM