【问题标题】:Getting org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join for inner join query in java获取 org.hibernate.hql.internal.ast.QuerySyntaxException:Java 中内部联接查询的联接预期路径
【发布时间】:2018-09-05 14:08:56
【问题描述】:
StringBuilder queryString = new StringBuilder(" FROM Organisation org ")
                .append(" INNER JOIN Abonne a ")
                .append(" WHERE org.idOrganisation = a.organisation ");

原因:org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!

我得到了 INNER JOIN Abonne 的预期路径 WHERE org.idOrganisation = a.organisation order by org.code ]

Abonne 实体 abonne 实体具有组织外键 @加入表id_org

    @Entity
    @Table(name = "T_ABONNE")
    public class Abonne {
        private static final long serialVersionUID = -7500240243978256087L;

        @Id
        @Column(name = "ID_ABONNE", columnDefinition = "CHAR(32)")
        @GeneratedValue(generator = "uuid")
        @GenericGenerator(name = "uuid", strategy = "uuid")
        private String idAbonne;

        @Column(name = "LIB_NOM", length = 200, nullable = false)
        private String nom;

        @Column(name = "BOO_ACTIF", nullable = false)
        private Boolean actif;

        @Column(name = "DAT_DATE_EXPIRATION", length = 10)
        @Type(type="utcType")
        private Date dateExpiration;

        @Column(name="NO_MAXIM_DE_UTILISATEURS", length = 5000)
        private Integer noMaxUsers;

        @ManyToOne
        @JoinColumn(name="ID_LANGUAGE", nullable=false)
        @Index(name = IndexNameUtil.T_ABONNE_ID_LANGUAGE_IDX)
        @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
        private Language language;

        @ManyToOne
        @JoinColumn(name="ID_THEME", nullable=false)
        @Index(name = IndexNameUtil.T_ABONNE_ID_THEME_IDX)
        @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
        private Theme theme;

        @ManyToOne
        @JoinColumn(name="ID_FONT", nullable=false)
        @Index(name = IndexNameUtil.T_ABONNE_ID_FONT_IDX)
        private Font font;

        @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="ID_ORG", nullable=false, updatable=false)
        @Index(name = IndexNameUtil.T_ABONNE_ID_ORG_IDX)
        @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
        private Organisation organisation;
}

组织实体 这是具有 idOrganisation 的组织实体

@Table(name = "T_ORGANISATION")
public class Organisation {

    private static final long serialVersionUID = 5348078630581306005L;

    public static final String COLUMN_ID_ORGANISATION = "ID_ORGANISATION";

    @Id
    @Column(name = COLUMN_ID_ORGANISATION, columnDefinition = "CHAR(32)")
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    private String idOrganisation;

    @Column(name = "LIB_NOM", nullable = false, length=250)
    private String nomOrganisation;

    @Column(name = "LIB_CODE", length=100)
    private String code;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="ID_FICHIER")
    @Index(name = IndexNameUtil.T_ORGANISATION_ID_FICHIER_IDX)
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    private File logo ;

}

【问题讨论】:

    标签: java spring hql


    【解决方案1】:

    如下更改您的查询:

    StringBuilder queryString = new StringBuilder("select a.organisation FROM Abonne a ")
    

    当您使用 a.organistion 时,它会自行在 hibernate 中创建连接。
    或者

    在组织中添加列表以进行双向映射并使用以下查询。

     @Table(name = "T_ORGANISATION")
        public class Organisation {
    
            private static final long serialVersionUID = 5348078630581306005L;
    
            public static final String COLUMN_ID_ORGANISATION = "ID_ORGANISATION";
    
            @Id
            @Column(name = COLUMN_ID_ORGANISATION, columnDefinition = "CHAR(32)")
            @GeneratedValue(generator = "uuid")
            @GenericGenerator(name = "uuid", strategy = "uuid")
            private String idOrganisation;
    
            @Column(name = "LIB_NOM", nullable = false, length=250)
            private String nomOrganisation;
    
            @Column(name = "LIB_CODE", length=100)
            private String code;
    
            @OneToOne(fetch = FetchType.LAZY)
            @JoinColumn(name="ID_FICHIER")
            @Index(name = IndexNameUtil.T_ORGANISATION_ID_FICHIER_IDX)
            @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
            private File logo ;
    
    @OneToMany(mappedBy="organisation")
    List<Abonne> abonnes;
    
    StringBuilder queryString = new StringBuilder(" FROM Organisation org ")
                    .append(" JOIN org.abonnes a ")
                    .append(" WHERE org.idOrganisation = a.organisation.idOrganisation ");
    

    【讨论】:

      【解决方案2】:

      这个应该可以工作:-

      StringBuilder queryString = new StringBuilder(" FROM Abonne a ")
                  .append(" INNER JOIN a.organisation org ")
                  .append(" WHERE org.idOrganisation = a.organisation ");
      

      【讨论】:

      • 当我更改为 On 时,仍然获得预期的加入路径:原因:org.hibernate.hql.internal.ast.QuerySyntaxException:预期加入的路径!
      • 请提供Organization和Abonne类的定义
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2012-12-06
      • 2011-05-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多