【问题标题】:Hibernate Criteria list always return 0 itemsHibernate Criteria 列表总是返回 0 个项目
【发布时间】:2013-04-10 10:11:26
【问题描述】:

无论我是否更改实体类,我的 DAO (findByUsername) 中的函数始终返回 0 行,即使从实体中删除注释后也没有例外,只有 0 行。根据我找到的一些示例,此代码在基于 spring 的应用程序中实现。

DAO

@Repository("userDao")
public class UserDao extends CustomHibernateDaoSupport {
    public void save(User user) {
        getHibernateTemplate().save(user);
    }

    public void delete(User user) {
        getHibernateTemplate().delete(user);
    }

    public User findByUsername(String username) throws DataNotFoundException {
        Session session = getSession();
        Criteria crit = session.createCriteria(User.class);
        System.out.println(username);
        crit.add(Restrictions.eq("username", username));
        crit.setMaxResults(1);

        List<User> users = crit.list();
        System.out.println(users);
        if (users.size() < 1) {
            throw new DataNotFoundException();
        }


        return users.get(0);
    }
}

实体

@Entity
@Table(name = "users")
public class User {
    private Integer id;
    private String username;
    private String password;
    private boolean active;
    private String activationCode;
    private Date createdAt;
    private String email;
    private Set<Wall> walls = new HashSet<Wall>();

    @Id
    @GeneratedValue
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return id;
    }

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

    @Column(name = "username", unique = true, nullable = false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name = "password")
    public String getPassword() {
        return password;
    }

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

    @Column(name = "active")
    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    @Column(name = "activation_code")
    public String getActivationCode() {
        return activationCode;
    }

    public void setActivationCode(String activationCode) {
        this.activationCode = activationCode;
    }

    @Column(name = "created_at", columnDefinition = "DATETIME")
    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    @Column(name = "email")
    public String getEmail() {
        return email;
    }

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

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "users_has_walls", joinColumns = { 
            @JoinColumn(name = "user_id", nullable = false, updatable = false) }, 
            inverseJoinColumns = { @JoinColumn(name = "wall_id", 
                    nullable = false, updatable = false) })
    public Set<Wall> getWalls() {
        return walls;
    }

    public void setWalls(Set<Wall> walls) {
        this.walls = walls;
    }
}

【问题讨论】:

  • 显而易见的问题:您的数据库中有数据吗?您也可以使用 crit.uniqueResult() 返回单个元素,而不是 crit.list().get(0);
  • Hibernate 生成的 SQL 是什么?有时生成的 SQL 与您对它应该做什么的期望不符。使用独立工具自行运行该 SQL 以帮助调试问题。
  • 将 SQL 日志记录设置“hibernate.show_sql”设置为“true”并检查生成的查询。尝试手动对您的数据库运行查询
  • 从 HQL 获取给了我:用户未映射 [FROM User]。我在用户表中有一行。
  • 似乎 hibernate 没有映射我的类,将其更改为扫描整个包,并在运行时将实体打开为异常。 IE。未知的 mappedBy 在:com.walladverts.model.entities.Post.user,引用的属性未知:com.walladverts.model.entities.User.user

标签: java spring hibernate


【解决方案1】:

解决方案是将导入声明更改为

import javax.persistence.Entity;

而不是休眠。 未导入用户实体类。

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2016-07-12
    • 1970-01-01
    • 2016-05-01
    • 2015-09-27
    • 2014-03-20
    相关资源
    最近更新 更多