【问题标题】:How to find a column field which is not primary key in JPA如何在 JPA 中查找不是主键的列字段
【发布时间】:2016-09-19 12:44:31
【问题描述】:

如果用户输入数据库中已经存在的特定数字,我会遇到这种情况,我应该抛出异常。

我尝试在 JPA 中使用 em.find 方法,但在 em.find 方法中我们需要传递实体类和主键,但这里我要查找的列不是主键。

例如:em.find("Article.class",articleno);其中articleno 不是主键

对于这个 Article.class,我有一个复合主键 (ArticlePk.class),其中 id 和 origin 是主键。

如何使用复合主键查找文章号。

你们能帮帮我吗?

【问题讨论】:

  • 您只需要使用 em.Find 吗?这意味着您也可以在这种情况下编写 JQL 并将 articleNo 作为输入参数传递。
  • 是的,我有一个由其他开发人员编写的代码,所以我需要使用该代码是否有这样做
  • 你需要在em.find()中传入复合主键对吗?
  • 但是你怎么能举个例子
  • 如果某个东西是一个复合 PK 那么它是如何“不是主键”的?!矛盾

标签: java database hibernate jpa entity


【解决方案1】:

我希望我能很好地理解你的情况。如果你在这里使用@EmbeddedId,那么你可以很容易地得到它。

@Entity
public class Article {
    @EmbeddedId
    private ArticlePk key;

    @Column(name = "Article_No")
    private String articleNo;

    /** Your getters and setters **/
}

@Embeddable
public class ArticlePK implements Seriza {

    @Column(name = "Id", nullable = false)
    private int id;

    @Column(name = "Origin", nullable = false)
    private String origin;

    /** getters and setters **/
}

在您的 DAO 实现中;

ArticlePK artPK = new ArticlePK();

artPK.setId(12334);
artPK.setOrigin("ABC123");

Article article = em.find(Article.class, artPK);
System.out.printl("Article no: " + article.getArticleNo());

【讨论】:

  • 但是我们如何检查 articleno 是否存在,我们只传递 id 和 origin ..?我需要通过文章号以及权利来检查它是否存在于 db..我们如何将 artpk,artorigin,articlee no 传递给 em.find
  • 获得文章实例后,您可以检查该实例(记录)是否有文章。也许您可以将文章编号定义为 Not Null 并确保它始终是字段?
【解决方案2】:

如果要根据复合主键获取文章对象,请看下文

ArticlePk articlePk = new ArticlePk();

articlePk .setId(1);
articlePk .setOrigin("");

Article article = em.find(Article .class, articlePk);

请确保 ArticlePk 实现了 Serializable

如果你严格按照articleNo查询,那么你可以使用JQL方法,你可以编写如下所示的查询

List results = em.createQuery("SELECT a FROM Article a where a.articleNo = :articleNo")
                        .setParameter("articleNo", "").getResultList();

在这种情况下,如果List 为空,则意味着articleDB 中找不到articleNo

【讨论】:

  • 但是我们如何检查 articleno 是否存在,我们只传递 id 和 origin ..?我需要传递文章号以及权限以检查它是否在 db..我们如何将 artpk、artorigin、articlee no 传递到 em.find
  • 正如我之前所说,那么在这种情况下,您必须选择 JQL 或 JPQL 或 Criteria 甚至原生 SQL。
猜你喜欢
  • 2018-08-15
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2016-10-18
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多