【发布时间】:2021-07-29 22:35:28
【问题描述】:
我有两张桌子:
DID池 DIDRange
一个池可以有多个范围。
范围表没有父 ID(例如,没有返回池的外键),因为范围表被许多其他实体使用。
因此,我设置了连接,以便它使用中间连接表 tbldidpooldidrange。
@Entity
@Table(name = "tbldidpool")
class DIDPool
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable = false, nullable = false)
private long id;
@OneToMany
@JoinTable(name = "tbldidpooldidrange", joinColumns = @JoinColumn(name = "did_pool_id")
, inverseJoinColumns = @JoinColumn(name = "did_range_id"))
private ArrayList<DIDRange> didRanges = new ArrayList<DIDRange>();
}
@Entity
@Table(name = "tbldidrange")
public class DIDRange
{@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable = false, nullable = false)
private long id;
@NotEmpty
@NotNull
@AttributeOverride(name = "phoneNumber", column = @Column(name = "start"))
private PhoneNumber start = new PhoneNumber();
}
jpa 正确生成中间连接表。
我的问题是创建一个连接两个表的 jql 表达式。
// Finds the pool that contains the given range or part range.
@SuppressWarnings("unchecked")
public List<DIDPool> findOverlapping(DIDRange didRange)
{
EntityManager em = EntityManagerProvider.getEntityManager();
Query query = em.createQuery("SELECT e FROM DIDPool e "
+ "join DIDRange r "
+ "where r.start.phoneNumber=:startNo"
+ " ) "
);
query.setParameter("startNo", didRange.getStartOfDIDRange().toCompactString());
return (List<DIDPool>) query.getResultList();
}
我对 jql 的理解是你没有指定 join 'on' 子句,因为 jpa 知道如何生成它。 然而,这是上述子句生成的 sql:
SELECT t1.ID,
FROM tbldidrange t0, tbldidpool t1 WHERE t0.start = ?
bind => [61383208100]
如您所见,没有“on”子句(并且 where 不连接表),甚至没有提及中间连接表。
我在这里做错了什么? 我一直在阅读 jpa 文档,它真的不是很有帮助。
【问题讨论】: