Hibernate的传统org.hibernate.Criteria API已经被弃用。

3

我正在使用Hibernate 5,但出现了以下错误:

2018年4月28日下午12:24:45 org.hibernate.internal.SessionImpl createCriteria WARN: HHH90000022:Hibernate的传统org.hibernate.Criteria API已弃用;请使用JPA javax.persistence.criteria.CriteriaQuery。

@Transactional
public class AccountDAOImpl implements AccountDAO {
    
    @Autowired
    private SessionFactory sessionFactory;


    @Override
    public ACCOUNTS findAccount(String userName) {
        // TODO Auto-generated method stub//
        
        Session session=sessionFactory.getCurrentSession();
        Criteria crit=session.createCriteria(ACCOUNTS.class).add(Restrictions.eq("user_name", userName));
        //crit.add(Restrictions.eq("user_name", userName));
        return (ACCOUNTS)crit.uniqueResult();
    }

}

接口 accountDAO

public interface AccountDAO {
    
     public ACCOUNTS findAccount(String userName );

}

以及模型类账户

package org.vikas.shoppingCart.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="ACCOUNTS")
public class ACCOUNTS implements Serializable
{
    private static final long serialVersionUID = 1L;
    public static final String ROLE_MANAGER = "MANAGER";
    public static final String ROLE_EMPLOYEE = "EMPLOYEE";
    
    private String user_name;
    private String user_password;
    private boolean active;
    private String user_role;
    
    @Id
    @Column(name="user_name",length=50,nullable=false)
    public String getUser_name() {
        return user_name;
    }
    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }
    
    @Column(name="user_password",length=20,nullable=false)
    public String getUser_password() {
        return user_password;
    }
    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }
    
    @Column(name="active",length=1,nullable=false)
    public boolean isActive() {
        return active;
    }
    public void setActive(boolean active) {
        this.active = active;
    }
    
    @Column(name="user_role",length=20,nullable=false)
    public String getUser_role() {
        return user_role;
    }
    public void setUser_role(String user_role) {
        this.user_role = user_role;
    }
    @Override
    public String toString() {
        return "ACCOUNTS [user_name=" + user_name + ", user_password=" + user_password + ", active=" + active
                + ", user_role=" + user_role + "]";
    }
}

我搜索了一下,它说要使用CreateBuilder来避免过时(因为我只展示了如何在List中显示所有数据的示例),但是我在这里使用了带有限制条件的add语句。

请帮助我理解如何在代码中使用createBuilder,就像我在代码中使用add(Restrictions.eq("user_name", userName));一样,或者是否有其他解决方案可以避免过时?

3个回答

3

这个日志是一个警告而不是错误:

2018年4月28日 下午12:24:45 org.hibernate.internal.SessionImpl createCriteria 警告:HHH90000022:Hibernate的遗留org.hibernate.Criteria API已被弃用;使用JPA javax.persistence.criteria.CriteriaQuery代替

它鼓励您在使用Hibernate时使用JPA API。

在问题的根源,您正在操作Session(Hibernate),而不是EntityManager(JPA)。反过来会导致您现有代码中的许多更改,因为大多数导入和处理方式都将不同。
您不能只更改一件事。

这是JPA的方法(包括导入):

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional;

@Transactional
public class AccountDAOImpl implements AccountDAO {

    @Autowired
    private EntityManager em;    

    @Override
    public ACCOUNTS findAccount(String userName) {    
        final CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<ACCOUNTS> crit = criteriaBuilder.createQuery(ACCOUNTS.class);
        Root<ACCOUNTS> root = crit.from(ACCOUNTS.class);
        crit.where(criteriaBuilder.equal(root.get("user_name"), userName))
            .distinct(true);
        return em.createQuery(crit).getSingleResult();      
    }

}

1
您可以像下面这样使用JPA的CriteriaBuilder API
// Create entity manager factory first
// Make sure the package name you specify `com.db.entity` matched what you specify in `pesistence.xml`
EntityManagerFactory entityManagerFactory = Persistence
        .createEntityManagerFactory("com.db.entity");
EntityManager em = entityManagerFactory.createEntityManager();


CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(Accounts.class);
cq.where(cb.equal(join.get("name"), "ordinary"));
TypedQuery<Accounts> tq = em.createQuery(cq);
List<Accounts> accounts = tq.getResultList();

return accounts;

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接