Java getFirstResult()返回0
我最近在做一个java教程,我在查询方面遇到了一个问题。 首先,我正在向数据库中添加person 图1: 图2: 现在,当我用query检查这个人是否在那里时,get firstResult()返回零:/ 人员类示例,带查询: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
@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=“用户未添加到数据库”;
}