【问题标题】:eclipse jpa jql not generating on clause for one to manyeclipse jpa jql没有为一对多生成on子句
【发布时间】: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 文档,它真的不是很有帮助。

【问题讨论】:

    标签: sql eclipse jpa join jql


    【解决方案1】:

    您的查询应该是

    Query query = em.createQuery("SELECT e FROM DIDPool e "
                  + "join e.didRanges r "
                  + "where r.start.phoneNumber=:startNo"
                  + " ) "
                   );
    

    您必须在 JOIN 中使用 ToMany 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-21
      • 2013-08-26
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多