Java 尝试使用hibernate 4测试记录的存在性

Java 尝试使用hibernate 4测试记录的存在性,java,spring,hibernate,Java,Spring,Hibernate,我在Spring 4控制器中有一个addEmployeewebservice,如接受emp_name和定义的代码所示。 当调用insertIntegertype方法时,使用Hibernate 4在数据库表中进行插入 @RequestMapping(value="/addEmployee", method=RequestMethod.GET) public String addEmployee ( @RequestParam(value="name", defaul

我在Spring 4控制器中有一个
addEmployee
webservice,如接受
emp_name
定义的代码所示。
当调用
insertIntegertype
方法时,使用Hibernate 4在数据库表中进行插入

@RequestMapping(value="/addEmployee", method=RequestMethod.GET)
    public String addEmployee
    (
        @RequestParam(value="name", defaultValue="") String emp_name,   
        @RequestParam(value="definition", defaultValue="") String definition
    ) 
    {  int emp_id = 0;

        try {
            EmpDao empDao = (EmpDao)context.getBean("empDao");
            Emp empInsert = new Emp();

            empInsert.setName(emp_name+" Attributes");
            empInsert.setDefinition(definition);
            empInsert.setOwnerName(owner_name_);
            emp_id = empDao.insertIntegertype(empInsert);

            }catch (Throwable th){
            // some code here 
            }
    }
需要包括以下检查:

正如代码中提到的,在设置员工姓名时,我还在这一行添加
属性
word
empiert.setName(emp_name+“Attributes”)
因此,当数据库中已经存在相同的名称时,可能会出现这样一种情况,在这种情况下,我想进行测试
该名称是否已存在于数据库中,然后仅继续插入。
我想知道在hibernate中有没有一种方法可以帮助我弄明白这件事

如果需要,我的
insertIntegertype
hibernate方法定义如下

public int insertIntegertype(Emp emp)
    {
        logger.debug("Starting EmpDaoImpl.insert() .....");
        Session session = null;
        Transaction tx = null;
        boolean status = true;
        int Emp_id = 0;
        try {
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            session.persist(emp);
            tx.commit();
            Emp_id = emp.getEmpId();
        } catch(Exception ex) {
            tx.rollback();
            ex.printStackTrace();
            status = false;
        } finally {
            session.close();
        }
        logger.debug("Completed EmpDaoImpl.insert() .....");
        return Emp_id;
    }       

您应该查询数据库以检查是否存在具有此名称的员工。然后,您可以根据需要继续保存员工

方法: 使用类似“Name%”的从数据库中进行选择查询如果不存在,则进行插入

您有3种选择:

1-使用本机查询

Session Session=sessionFactory.openSession();
session.beginTransaction();
String sql=“从名为'Name%'的员工中选择第一个姓名”
NativeQuery=session.createNativeQuery(sql);
List=query.List();
if(list.isEmpty()){
会议(emp);
}
2-使用HQL

Session Session=sessionFactory.openSession();
session.beginTransaction();
Query Query=session.createQuery(“从员工u中选择u.name,其中u.name类似于:name”);
List List=query.setParameter(“Name”,Name+“%”)List();
if(list.isEmpty()){
会议(emp);
}
3-使用CriteriaBuilder

Session Session=sessionFactory.openSession();
session.beginTransaction();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(String.class);
根=标准。从(类);
路径属性=root.get(col);
条件。选择(属性)。其中(生成器。(属性,名称+“%”);
List List=session.createQuery(条件).getResultList();
if(list.isEmpty()){
会议(emp);
}

是的,从逻辑上讲,我知道需要这样做。我不确定在hibernate中是如何工作的。你知道吗?你应该调用会话对象上的方法。您可以在那里运行HQL或本机SQL查询。请参阅以下连结:,
Session session = sessionFactory.openSession();
session.beginTransaction();
String sql = "select First_Name FROM employee where First_Name like 'NAME%'"
NativeQuery query = session.createNativeQuery(sql);
List<Object[]> list = query.list();
if (list.isEmpty()) {
session.persist(emp);
}
Session session = sessionFactory.openSession();
session.beginTransaction();
Query query = session.createQuery("select u.name from Employee u where u.name like :Name");
List<Object[]> list= query.setParameter("Name", name+ "%").list();
if (list.isEmpty()) {
session.persist(emp);
}
Session session = sessionFactory.openSession();
session.beginTransaction();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<String> criteria = builder.createQuery(String.class);
Root  root = criteria.from(class);
Path <String> attribute = root.get(col);
criteria.select(attribute).where(builder.(attribute,NAME + "%"));
List<String> list = session.createQuery(criteria).getResultList();
if (list.isEmpty()) {
session.persist(emp);
}