Java 连接表时形成的JPQL查询不正确

Java 连接表时形成的JPQL查询不正确,java,hibernate,jpa,hql,jpql,Java,Hibernate,Jpa,Hql,Jpql,假设我有两个实体:应用程序和组织。它们是多对多相关的 组织机构: @Entity @Table(name = "organizations") public class Organization { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "organizationIdGenerator") private long id; // primary key @Att

假设我有两个实体:应用程序组织。它们是多对多相关的

组织机构:

@Entity
@Table(name = "organizations")
public class Organization
{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "organizationIdGenerator")
    private long id;  // primary key

    @AttributeOverride(name = "id", column = @Column(name = "organization_id", unique = true, updatable = false))
    @Embedded
    private OrganizationId organizationId;

    @AttributeOverride(name = "id", column = @Column(name = "application_id"))
    @CollectionTable(name = "organization_applications")
    @ElementCollection
    private Set<ApplicationId> applications = new HashSet<>();  // there is no explicit @Many-to-many connection between applications and organizations

    private String name;

    // other data
}
@Entity
@Table(name = "applications")
public class Application
{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "applicationIdGenerator")
    private long id; // primary key

    @AttributeOverride(name = "id", column = @Column(name = "application_id", unique = true, updatable = false))
    @Embedded
    private ApplicationId applicationId;

    private String label;

    // other data 
}
由于它们是多对多相关的,在关系数据库中,我有以下表格:

  • 组织机构
  • 应用程序
  • organization\u应用程序
organization\u applications
是通过以下liquibase迁移创建的:

<createTable tableName="organization_applications">
  <column name="organization_id" type="bigint">
    <constraints nullable="false" foreignKeyName="organization_application_organization_id_fk"
                 referencedTableName="organizations" referencedColumnNames="id"/>
  </column>
  <column name="application_id" type="varchar(50)">
    <constraints nullable="false"/>
  </column>
</createTable>
但是,当我尝试使用JPQL查询来完成此任务时,如下所示:

SELECT new List(o.applications) FROM Organization o WHERE o.organizationId.id = 1
public class ApplicationId
{
    private String id;

    // constructor and getters
}
SELECT a FROM Organization o JOIN o.applications a WHERE o.organizationId.id = 1
我得到以下查询,然后是异常:

Hibernate: 
    /* SELECT
        new List(o.applications) 
    FROM
        Organization o 
    WHERE
        o.organizationId.id = :org_id */ select
            . as col_0_0_          // <-- problem here. why is there just a dot?
        from
            organizations organizati0_ 
        inner join
            organization_applications applicatio1_ 
                on organizati0_.id=applicatio1_.organization_id 
        where
            organizati0_.organization_id=?

SqlExceptionHelper   : SQL Error: 20000, SQLState: 42X01
SqlExceptionHelper   : Syntax error: Encountered "." at line 1, column 102.

OrganizationId看起来完全一样

您可以像这样选择应用程序ID:

SELECT new List(o.applications) FROM Organization o WHERE o.organizationId.id = 1
public class ApplicationId
{
    private String id;

    // constructor and getters
}
SELECT a FROM Organization o JOIN o.applications a WHERE o.organizationId.id = 1

您尚未定义引用的两个实体之间的实际关系。您只需拥有一组未定义的嵌入式对象。这不是M-N关系,查询中不可能有新列表。您想实现什么?@BillyFrost我添加了一个迁移,创建了一个定义其关系的表,由于
组织
不是此关系的所有者,因此没有明确定义的关系(通过
@ManyToMany
)@SimonMartinelli,我正在尝试获取属于特定组织的应用程序列表。既然JPQL需要一个将由结果值填充的DTO,而且我正在尝试获取应用程序列表,那么我应该使用什么类型?另外,
select new List(…)
如果我需要一对多相关的属性(例如,组织的电话号码),则可以完美地工作。请看一看从组织o中尝试选择o.applications,其中o.organizationId.id=1,并查看您将在结果列表中找到的类型。这样执行时,此查询将返回
ApplicationId
s(而不是
Application
s)列表:
query q=this.entityManager.createQuery(“从组织中选择一个组织加入o.a应用程序,其中o.organizationId.id=:org_id”);q.setParameter(“org_id”,“1”);List resultList=(List)q.getResultList()
实际的连接没有发生,我想知道为什么,因为hibernate生成了带有连接的查询:
…内部连接组织\u应用程序applications applications application1\u在组织上0\u.id=application1\u.organization\u id…
我很困惑。您想要什么作为返回类型?我想要一个应用程序列表(
List
)。因为获取
ApplicationId
s的列表需要额外的查询(通过
ApplicationId
s获取
Application
s)。所以我不得不以某种方式加入表
applications
。我正在努力为此创建一个JPQL查询。如果我的解释让您感到困惑,很抱歉:)