Java 如何查找JPA中不是主键的列字段

Java 如何查找JPA中不是主键的列字段,java,database,hibernate,jpa,entity,Java,Database,Hibernate,Jpa,Entity,我有这样的情况,如果用户输入一个已经存在于数据库中的特定数字,我应该抛出异常 我尝试在JPA中使用em.find方法,但在em.find方法中,我们需要传递实体类和主键,但这里我要查找的列不是主键 例如:em.find(“Article.class”,articleno);其中articleno不是主键 对于这个Article.class,我有一个复合主键(ArticlePk.class),其中id和origin是主键 如何找到文章没有使用复合主键 你们能帮帮我吗?如果你们想得到基于复合主键的文

我有这样的情况,如果用户输入一个已经存在于数据库中的特定数字,我应该抛出异常

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

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

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

如何找到文章没有使用复合主键


你们能帮帮我吗?

如果你们想得到基于复合主键的文章对象,请看下面

ArticlePk articlePk = new ArticlePk();

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

Article article = em.find(Article .class, articlePk);
请确保ArticlePk实现可序列化

如果您严格希望按articleNo进行查询,那么您可以使用JQL方法,您可以编写如下所示的查询

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

在这种情况下,如果
列表
为空,这意味着
文章
对于该
文章
,在
数据库

中找不到该
文章号
,如果您希望基于复合主键获取文章对象,请参见下文

ArticlePk articlePk = new ArticlePk();

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

Article article = em.find(Article .class, articlePk);
请确保ArticlePk实现可序列化

如果您严格希望按articleNo进行查询,那么您可以使用JQL方法,您可以编写如下所示的查询

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

在这种情况下,如果
列表
为空,则意味着
文章
,因为该
文章在
数据库

中找不到。如果您在这里使用@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());

我希望我很了解你的情况。如果您在这里使用@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());


您是否需要使用它们。仅查找?也就是说,在这种情况下,你也可以编写一个JQL,并将articleNo作为输入参数传递。是的,我有一个由其他开发人员编写的代码,所以我需要使用该代码。无论如何,你都需要在em中传递复合主键。find()正确吗?但是你怎么能给出一个例子呢?如果某个东西是复合主键,那么它如何“不是主键”?!矛盾您是否需要使用它们。仅查找?也就是说,在这种情况下,你也可以编写一个JQL,并将articleNo作为输入参数传递。是的,我有一个由其他开发人员编写的代码,所以我需要使用该代码。无论如何,你都需要在em中传递复合主键。find()正确吗?但是你怎么能给出一个例子呢?如果某个东西是复合主键,那么它如何“不是主键”?!矛盾但是我们如何检查articleno是否存在我们只传递id和来源。。?我需要传递文章编号以及检查它是否存在于db中的权利。我们如何将artpk、artorigin、article编号传递到em中。Findon一旦您获得了文章实例,您可以检查此实例(记录)是否有任何article编号。也许您可以将article no定义为Not Null,并确保它始终是字段?但是我们如何检查article no是否存在?我们只传递id和来源。。?我需要传递文章编号以及检查它是否存在于db中的权利。我们如何将artpk、artorigin、article编号传递到em中。Findon一旦您获得了文章实例,您可以检查此实例(记录)是否有任何article编号。也许您可以将article no定义为Not Null,并确保它始终是字段?但是我们如何检查article no是否存在?我们只传递id和来源。。?我需要传递文章编号以及检查它是否存在于db中的权利。我们如何将artpk、artorigin、article编号传递到我之前说过的em.findAs中,那么在这种情况下,您必须选择JQL或JPQL或Criteria,甚至本机SQL。但是我们如何检查文章编号是否存在?我们只传递id和origin。。?我需要传递文章号以及检查它是否存在于db中的权利。我们如何将artpk、artorigin、article号传递到我之前说过的em.findAs中,那么在这种情况下,您必须选择JQL或JPQL或Criteria,甚至本机SQL。