getFirstResult()返回0

问题描述 投票:0回答:2

我最近在做一个java教程,我遇到了查询问题。首先我正在添加人员到数据库。

图片1:enter image description here

图片2:enter image description here

现在,当我查询该人是否在那里时,get firstResult()返回零:/。

Person类示例,带有查询:

@Entity
@NamedQuery(name="findQuery", query="select p from Person p where p.id=:id")
public class Person {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    //@Column(name="personId")
    private long id;
    //@Column(name="personName")
    private String name;
    //@Column(name="personAge")
    private int age;
    //@Column(name="personNumber")
    private int number;

现在检查查询的类:

@Override
public String read(long id) {


    TypedQuery<Person> createNamedQuery = em.createNamedQuery("findQuery", Person.class);
    createNamedQuery.setParameter("id", id);

    int firstResult = createNamedQuery.getFirstResult();
    System.out.println("test: "+firstResult);

    if (createNamedQuery.getFirstResult()>0) {
        Person singleResult = createNamedQuery.getSingleResult();
        creationMessage = "User: " + singleResult.getName() + " added to database with success";
    } else {
        creationMessage = "User was not added to database";
    }
    return creationMessage;
}

当我尝试查找id为1的人时,getFirstResult返回零:/。有人可以帮助我,我做错了什么?

我不知道它是否重要,但数据源是JTA。 :)

java mysql jpa jpql
2个回答
1
投票

来自qavxswpoi的Javadoc:

查询对象设置为检索的第一个结果的位置。如果未将setFirstResult应用于查询对象,则返回0

你从未打电话给Query#getFirstResult(),所以setFirstResult应该归零。我怀疑你将这种方法混淆为可以检测是否存在匹配记录的东西。而是使用以下代码:

getFirstResult

如果没有找到用户记录,或者如果找到多个记录,TypedQuery<Person> createNamedQuery = em.createNamedQuery("findQuery", Person.class); createNamedQuery.setParameter("id", id); try { Person singleResult = createNamedQuery.getSingleResult(); creationMessage = "User: " + singleResult.getName()+" added to database with success"; } catch (Exception e) { System.out.println("Either less than one row, more than one row, or some other error"); } 将抛出异常。通过捕获异常,您可以确定查询是否成功。迭代结果集通常以这种方式工作;你一次读一条记录,并随着时间的推移弄清楚事情。


0
投票

我认为你应该尝试重构一下你的解决方案,因为getSingleResult()主要用于分页目的,而不是你想要的东西。

如果没有找到任何结果,更自然的方法是获得单个结果并捕获和异常:

firstResult
© www.soinside.com 2019 - 2024. All rights reserved.