mysql - HQL 在子查询和子句中不起作用

标签 mysql sql hibernate hql

像这样在 mysql 中有 3 个表:

CREATE TABLE tstudent(
  id varchar(36) primary key not null,
  firstname VARCHAR(30) NOT NULL,
  lastname VARCHAR(30)  NOT NULL,
  grade int   NOT NULL,
  sex VARCHAR(1)      NOT NULL,
  birthday DATE,
  dayorboarding VARCHAR(1)    NOT NULL,
  age int   ,
  house VARCHAR(20),
  mentor VARCHAR(50)
);


CREATE TABLE ttrip(
  id varchar(36) primary key not null,
  departureday       DATE         NOT NULL,
  name varchar(100) not null unique
);

CREATE TABLE tsignup(
  id varchar(36) primary key not null,
  s_id varchar(36) not null,
  FOREIGN KEY (s_id) REFERENCES tstudent(id), 
  t_id varchar(36) not null,
  FOREIGN KEY (t_id) REFERENCES ttrip(id),
  departuretransport   VARCHAR(1)   NOT NULL,
  returntransport    VARCHAR(1)   NOT NULL,
  remark TEXT
);

我可以使用这个 sql 来查询这样的信息:

mysql> select * from tsignup where t_id in (select id from ttrip where  name like '%bar%');
... ignore data ...  
1 row in set (0.00 sec)

但是当像这样使用hql时,它不起作用:

@Override
public DataGrid datagrid(Signup signup) {
    DataGrid dg = new DataGrid();

    String hql = "from Tsignup t";  
    Map<String, Object> params = new HashMap<String, Object>(); 
    hql = addWhere(signup, hql, params);

    String totalHql = "select count(*) " + hql; 
    hql = addOrder(signup, hql);
    List<Tsignup> l = signupDao.find(hql, params, signup.getPage(), signup.getRows());
    List<Signup> nl = new ArrayList<Signup>();
    changeModel(l, nl);
    dg.setTotal(signupDao.count(totalHql, params));
    dg.setRows(nl);
    return dg;
}

private String addWhere(Signup signup, String hql, Map<String, Object> params) {

    if(signup !=null){
        hql += " where 1=1 ";
        if(signup.getName() != null  && !signup.getName().trim().equals("")){
            hql += " and t.id in (select trip.id from ttrip as trip where trip.name like :name)";
            params.put("name", "%%" + signup.getName().trim() + "%%");
        }

    }
// logger will print:
    logger.info(signup.getName());
    logger.info(hql);

    return hql;
}

系统打印如下:

[cz.service.impl.StudentServiceImpl]bar
[cz.service.impl.StudentServiceImpl]from Tsignup t where 1=1  and t.id in (select trip.id from ttrip as trip where trip.name like :name)

想知道在 Hql 中创建相同 sql 的正确方法是什么。

最佳答案

寻找解决方案:

    String hql = "from Tsignup t";      
    Map<String, Object> params = new HashMap<String, Object>(); 
    hql = addWhere(signup, hql, params);

...

        hql += " where 1=1 ";
        if(signup.getName() != null  && !signup.getName().trim().equals("")){
            hql += " and t.ttrip.id in (select id from Ttrip where name like :name)";
            params.put("name", "%%" + signup.getName().trim() + "%%");

关于mysql - HQL 在子查询和子句中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33968034/

相关文章:

php - Codeigniter Join 弄乱了 'id' 字段

mysql - 减少 Linux 服务器上磁盘 IO 的最佳方法

sql - 一次在 SQL 查询中选择 100 多个列(但不是所有表列)的便捷方法?

sql - Ruby 构建 .where 超过两个类

java - 将字符串日期转换为 yyyy-MM-dd 格式以传入 hibernate 条件

mysql - ActiveRecord MySQL 在查询期间丢失与 MySQL 服务器的连接

java - PDFbox arabic textnot show 从数据库 mysql 检索

php - 定义媒体列表的属性并在一行中返回值

hibernate - 使用 Redisson 作为 Hibernate Level 2 缓存时,本地缓存更新是否会从所有应用程序节点中逐出

java - @MappedSuperclass 父类(super class)属性在执行选择后为空