【问题标题】:Why do I get NoResultException in hibernate when there is a data in the database?当数据库中有数据时,为什么我在休眠中得到 NoResultException?
【发布时间】:2019-01-02 15:08:29
【问题描述】:

我试图通过电子邮件使用 HQL 从休眠状态的 MySql 数据库中获取实体。但是,我得到javax.persistence.NoResultException: No entity found for query,即使它存在于数据库中。我正在尝试使用 getSingleResults() 通过电子邮件检索它,并且电子邮件在数据库中是唯一的,因此我确信只会有一个结果。

请参考以下代码:

@Override
    public UserDetails getUser(String email) {

        Session currentSession = sessionFactory.getCurrentSession();

        Query query = currentSession.createQuery("from UserDetails u where u.email = :email ");
        query.setParameter("email", email);
        return (UserDetails) query.getSingleResult();
    }

实体类请参考以下代码:

package com.travelplanner.rest.entity;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;

@Entity
@Table(name = "users_details")
public class UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @Transient
    private String password;

    @OneToMany(mappedBy = "userDetails", cascade = CascadeType.ALL)
    @JsonIgnore
    @JsonManagedReference
    private List<TravelPlans> travelPlans;

    public UserDetails() {
    }

    public UserDetails(int id, String firstName, String lastName, String email) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<TravelPlans> getTravelPlans() {
        return travelPlans;
    }

    public void setTravelPlans(List<TravelPlans> travelPlans) {
        this.travelPlans = travelPlans;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
    }

    public void add(TravelPlans travelPlan) {
        if (travelPlans == null) {
            travelPlans = new ArrayList<>();
        }

        travelPlans.add(travelPlan);

        travelPlan.setUserDetails(this);
    }

}

如果有帮助,控制器中的代码:

@GetMapping("/users/{email}")
    public UserDetails authUser(@PathVariable String email) {
        return userService.getUser(email);
    }

请求地址为:http://localhost:8080/api/users/xlz@wwe.com

请帮忙! 提前致谢。

【问题讨论】:

  • 调试时间...
  • 好的,我在本地试过了,Spring会自动为你解码@字符,你能提供更多信息吗? getUser 函数获取什么数据?它是正确的还是空的?您的实体看起来如何?不带email参数能全选吗?
  • 电子邮件栏是否区分大小写?
  • @aBnormaLz getUser() 应该只返回一个 UserDetails 实体。
  • 好的,但我不确定是什么问题。因此,如果您可以在没有电子邮件参数的情况下获得它,那么问题出在您的电子邮件参数上。如果没有参数你不能得到它,那么问题出在其他地方

标签: java spring hibernate hql


【解决方案1】:

尝试定义路径变量的名称。 请将@PathVariable String email 替换为@PathVariable(value="email") String email .

根据上述评论,您必须在请求xlz%40wwe.com 中对电子邮件进行编码 但没有必要在 java 代码中对其进行解码。它应该可以在没有解码的情况下工作。

【讨论】:

  • 试过 @PathVariable(value="email") String email ,我还是得到了异常。
  • 你,我没有。能否请您演示一下如何做到这一点。
  • System.out.println(email);添加到getUser()方法的第一行!并查看请求的电子邮件。
  • 这很有帮助! .com 似乎丢失了。就是 xlz@wwe 为什么要删掉呢?
  • 谢谢我已经实施了解决方案,现在响应是 406。
猜你喜欢
  • 2017-07-11
  • 2016-10-07
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2015-10-27
  • 2014-06-29
相关资源
最近更新 更多