【问题标题】:Querydsl entity inheritance query with joinQuerydsl 实体继承查询与连接
【发布时间】:2015-04-27 09:38:03
【问题描述】:

我有三个实体。用户(父)

@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 ....

我不明白为什么我的联接不起作用

【问题讨论】:

  • 由于查询是问题,如果您将其全部包含在内会很好
  • 你想提取什么信息?

标签: java hibernate postgresql jpa querydsl


【解决方案1】:

在 JPQL 中,您可以加入属性,但不能加入鉴别器表,就像您尝试做的那样。但是,如果您能描述您需要的信息,那将会很有帮助。

【讨论】:

    【解决方案2】:

    没有看到整个查询就不能说。

    但通常你不会加入 JPA 中的继承表。 如果您想要所有用户(包括记者、编辑...),您只需运行Select U from User u

    如果您只需要您查询的记者:select u From Journalist U

    JPA 将在需要时将其转换为连接(这样您就可以将继承类型更改为单个表,并且您的查询仍然有效)

    【讨论】:

      【解决方案3】:

      没有必要进行左连接。因为您已经在“@Inheritance (strategy = InheritanceType.JOINED)”类中完成了映射。 因此,当您进行查询时,将使用这种方式自动完成连接:

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

      Documentation about Inheritance

      References: Simple Example QueryDsl

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多