Java getFirstResult()返回0

Java getFirstResult()返回0,java,mysql,jpa,jpql,Java,Mysql,Jpa,Jpql,我最近在做一个java教程,我在查询方面遇到了一个问题。 首先,我正在向数据库中添加person 图1: 图2: 现在,当我用query检查这个人是否在那里时,get firstResult()返回零:/ 人员类示例,带查询: @Entity @NamedQuery(name="findQuery", query="select p from Person p where p.id=:id") public class Person { @Id @GeneratedValu

我最近在做一个java教程,我在查询方面遇到了一个问题。 首先,我正在向数据库中添加person

图1:

图2:

现在,当我用query检查这个人是否在那里时,get firstResult()返回零:/

人员类示例,带查询:

@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){
TypedQuery createNamedQuery=em.createNamedQuery(“findQuery”,Person.class);
createNamedQuery.setParameter(“id”,id);
int firstResult=createNamedQuery.getFirstResult();
System.out.println(“测试:+firstResult”);
如果(createNamedQuery.getFirstResult()>0){
Person singleResult=createNamedQuery.getSingleResult();
creationMessage=“用户:”+singleResult.getName()+“成功添加到数据库”;
}否则{
creationMessage=“用户未添加到数据库”;
}
返回creationMessage;
}
当我尝试查找id为1:/的人时,getFirstResult返回零。谁能帮帮我,我做错了什么

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

来自Javadoc,用于:

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

您从未调用过
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");
}
TypedQuery createNamedQuery=em.createNamedQuery(“findQuery”,Person.class);
createNamedQuery.setParameter(“id”,id);
试一试{
Person singleResult=createNamedQuery.getSingleResult();
creationMessage=“用户:”+singleResult.getName()+“成功添加到数据库”;
}
捕获(例外e){
System.out.println(“少于一行、多于一行或某些其他错误”);
}
getSingleResult()
如果找不到任何用户记录,或者找到多个记录,则将引发异常。通过捕获异常,可以确定查询是否成功。迭代结果集通常是这样工作的;您一次读取一条记录,并在进行过程中找出问题所在。

来自Javadoc的:

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

您从未调用过
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");
}
TypedQuery createNamedQuery=em.createNamedQuery(“findQuery”,Person.class);
createNamedQuery.setParameter(“id”,id);
试一试{
Person singleResult=createNamedQuery.getSingleResult();
creationMessage=“用户:”+singleResult.getName()+“成功添加到数据库”;
}
捕获(例外e){
System.out.println(“少于一行、多于一行或某些其他错误”);
}

getSingleResult()
如果找不到任何用户记录,或者找到多个记录,则将引发异常。通过捕获异常,可以确定查询是否成功。迭代结果集通常是这样工作的;您一次只读取一条记录,并在进行过程中找出问题所在。

我认为您应该尝试重构您的解决方案,因为
firstResult
主要用于分页目的,我想这不是您在这里要找的

更自然的方法是,如果未找到任何内容,则获得单一结果、捕获和异常:

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(NoResultException e) {
    creationMessage = "User was not added to database";
} 
TypedQuery createNamedQuery=em.createNamedQuery(“findQuery”,Person.class);
createNamedQuery.setParameter(“id”,id);
试一试{
Person singleResult=createNamedQuery.getSingleResult();
creationMessage=“用户:”+singleResult.getName()+“成功添加到数据库”;
}捕获(noresulte异常){
creationMessage=“用户未添加到数据库”;
} 

我认为您应该尝试重构您的解决方案,因为
firstResult
主要用于分页目的,我想这不是您在这里寻找的

更自然的方法是,如果未找到任何内容,则获得单一结果、捕获和异常:

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(NoResultException e) {
    creationMessage = "User was not added to database";
} 
TypedQuery createNamedQuery=em.createNamedQuery(“findQuery”,Person.class);
createNamedQuery.setParameter(“id”,id);
试一试{
Person singleResult=createNamedQuery.getSingleResult();
creationMessage=“用户:”+singleResult.getName()+“成功添加到数据库”;
}捕获(noresulte异常){
creationMessage=“用户未添加到数据库”;
}