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查询。如果我的解释让您感到困惑,很抱歉:)