【问题标题】:JPA query many to one associationJPA 查询多对一关联
【发布时间】:2010-04-11 18:53:48
【问题描述】:

我想构建以下伪查询

Select a From APDU a where a.group.id= :id

group 是 APDUGroup.class 类型的 APDU 类中的一个字段。

我只想根据 APDUGroup 的 id 获取 APDU 列表。

如何使用标准 JPA 查询来做到这一点?

更新

是的,在发布到 S/O 之前,我已经尝试了上述查询并尝试了几个小时的其他变体。这是上面查询生成的 SQL:

SELECT t1.ID, t1.status, t1.type, t1.modified, t1.response, t1.expectedSize, t1.created, t1.description, t1.sequence, t1.name, t1.command, t1.recurring, t1.auth, t1.createdBy, t1.APDUGroup, t1.modifiedBy FROM APDUGroup t0, APDU t1 WHERE ((t0.ID = ?) AND (t0.ID = t1.APDUGroup))

查询看起来不错,但没有从我的表中选择。 我的测试数据库中至少有 100 个 APDUGroup = 1 的 APDU。

我使用 eclipselink 作为 JPA 提供程序。

【问题讨论】:

  • 你写的查询试过了吗?
  • 是的,我做到了,但我一无所获。查看我更新的问题
  • 如果在 SQL 客户端中执行查询会发生什么?你能发布你的映射吗(我想知道为什么 eclipselink 在这里加入)?

标签: jpa object field associations


【解决方案1】:

给定以下实体:

@Entity
public class APDU implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    private APDUGroup group;

    //...

}

@Entity
public class APDUGroup implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    //...
}

以下查询将返回给定 APDUGroup id 的 APDU 列表:

select a from APDU a where a.group.id = :id

哦,等等,这是你的问题:)

【讨论】:

  • 天啊!你是对的!那是我的查询:),我在这里发布之前尝试过,我根本没有得到任何结果。想也许还有其他方法可以做到这一点。
  • 我找到了我痛苦的根源。查询没有问题,服务层中的一些代码将关联的APDU Groups设置为null,以防止对象序列化为XML时出现循环图关系。感谢您的帮助:)
  • @Random 很高兴你发现了(真正的)问题:)
【解决方案2】:

实体 1:

@Entity
@Getter
@Setter
@Table(name = "invoices")
public class Invoice implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "invoice_id", updatable = false, nullable = false)
    private Long invoiceId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false, nullable = false)   
    private Person person;

    //...

}

实体 2:

@Entity
@Getter
@Setter
@Table(name = "people")
public class Person implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "person_id", updatable = false, nullable = false)
    private Long personId;

    //...
}

最后,您的数据访问对象(JPA 存储库)

@Repository
public interface InvoiceRepository extends JpaRepository<Invoice, Long> {
    @Query(value="SELECT x FROM Invoice x WHERE x.person.personId = :myPersonId")
    List<Invoice> findInvoiceByPersonId (long myPersonId);
}

我希望这个例子对你有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-08
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多