我用hibernate中的hql语句写了一个条件查询,但是不能正常执行,请帮忙看一下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用hibernate中的hql语句写了一个条件查询,但是不能正常执行,请帮忙看一下相关的知识,希望对你有一定的参考价值。

public List<User> selectUser(User user)
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("from User where 1=1 ");
if(user.getUsername()!=null&&user.getUsername().trim().length()>0)
stringBuffer.append("and username like +'%"+user.getUsername()+"%'");
if(user.getSex()!=null&&user.getSex().trim().length()>0)
stringBuffer.append("and sex="+user.getSex());
if(user.getEducation()!=null&&user.getEducation().trim().length()>0)
stringBuffer.append("and education="+user.getEducation());
if(user.getIsUpload()!=null&&user.getIsUpload().trim().length()>0)
if(user.getIsUpload().equals("1"))
stringBuffer.append("and filename is not null");
else if(user.getIsUpload().equals("2"))
stringBuffer.append("and filename is null");


String sql=new String(stringBuffer);
//1.开启session
Session session=sessionFactory.openSession();
//2.操作对象
Query query=session.createQuery(sql);
List<User>users=query.list();
session.close();
return users;

你报的错误是啥?很直观的看你的代码,在所有的and之前都没有空格,所以拼出来的HQL是有问题的,你的代码还有几个问题
1,最好用StringBuilder或者StringBuffered
2,最好不要用where 1=1这样查询效率最低。
如果你想了解更多的Hibernate查询或者HQL的东西,看我的个人简介里面的推荐资料。
参考技术A 肯定执行不了了 都没有空格 输出的sql 不对

建议:写一个 test方法 传一个user 进来 看看你输出的 sql 是什么样子 然后根据你的sql 一项项的调
还有 你那些个 !=null, .trim().length()>0 你就不能抽一个方法出来 这样好难看的
参考技术B stringBuffer.append(" and education="+user.getEducation()); // and前,应该留一空格
如果查询的条件是字符串,应该加单引号。

——查询的条件,最好使用参数 。没你的环境,不太好测试。
参考技术C 你的sql只是相加了 但是你看看你的sql 的查询条件 如果都有的话 你的查询条件前后都没有空格,会连起来的,所以无法分析

Hibernate的增删改查操作

一、在Hibernate中使用原生SQL语句

  • sql语句面向的是数据库,所以sql语句中对应的不再是bean了,比如sql="select * from user"   在hql中*是无效的,但是在sql中可以使用,且user指的是数据库中的user表。

案例一:

package action;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.transform.Transformers;

import bean.User;
import util.HibernateUtil;

/**
 * hibernate支持原生SQL语句操作
 * 
 * @author 半颗柠檬、
 * 
 */
public class Query_SQL {

    public static void main(String[] args) {
         Query_SQL.testQuery(); // hibernate支持原生SQL语句的查询操作
//        Query_SQL.insert(); // insert语句
    }

    private static void testQuery() {

        Session session = null;
        Transaction tran = null;
        SQLQuery sqlQuery = null;
        String sql = "";
        try {
            session = HibernateUtil.getSession();
            tran = session.beginTransaction();

            // HQL语句不能使用* , 而原生sql语句可以,且user对应的是数据库中的表名而不是bean的类名
            sql = " select * from user where username like :username ";
            sqlQuery = session.createSQLQuery(sql);
            sqlQuery.setString("username", "%user%");

            sqlQuery.setFirstResult(0);
            sqlQuery.setMaxResults(2);
            // 查询结果默认返回数组
            List<Object[]> objList = sqlQuery.list();

            System.out.println(objList.size());

            /**
             * 查询结果返回一个bean
             */
            sql = " select * from user where username like :username ";
            sqlQuery = session.createSQLQuery(sql);
            sqlQuery.setString("username", "%user%");

            // addScalar(String)方法作用:
            // 指定查询结果包含哪些数据列---没有被addScalar选出的列将不会包含在查询结果中。
            sqlQuery.addScalar("username");
            sqlQuery.addScalar("userid");
            
            // 把结果转为bean,注意bean的字段名要和数据库的字段名一致,区分大小写
            //如果数据库的字段和bean中的属性名不一致,这里的数据库中的is_admin和bean中的isadmin不一致,可以通过在sql语句中添加别名sql="select is_admin as isadmin"来使得
            //两者一致
            sqlQuery.setResultTransformer(Transformers.aliasToBean(User.class));

            List<User> userList = sqlQuery.list();

            for (User user : userList) {

                System.out.println("username=" + user.getUsername()
                        + "\t userid=" + user.getUserid());

            }

            tran.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tran.rollback();
        } finally {
            HibernateUtil.closeSession();
        }

    }

    private static void insert() {

        Session session = null;
        SQLQuery sqlQuery = null;
        Transaction tran = null;
        String sql = "";
        try {
            session = HibernateUtil.getSession();
            tran = session.beginTransaction();

            sql = "insert into user(userid,username,password) values(?,?,?)";

            sqlQuery = session.createSQLQuery(sql);
            sqlQuery.setParameter(0, 8);
            sqlQuery.setParameter(1, "user6");
            sqlQuery.setParameter(2, "123");

            int count = sqlQuery.executeUpdate();
            System.out.println("插入了" + count + "条数据");

            tran.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tran.rollback();
        } finally {
            HibernateUtil.closeSession();
        }

    }

}

 代码在下面章节

以上是关于我用hibernate中的hql语句写了一个条件查询,但是不能正常执行,请帮忙看一下的主要内容,如果未能解决你的问题,请参考以下文章

hibernate提交数据到数据库中,为啥查不到呢,数据库中已经可以查到了,是事物提交的问题吗?

hibernate怎么用查询

hibernate之HQL查询

Hibernate的增删改查操作

谁知道用hql查记录数该怎么查呢??

hibernate HQL语句 类名大小写问题