在休眠中拆分字符串

时间:2014-11-05 10:52:29

标签: java mysql hibernate

我有这样的查询。

SELECT * 
FROM test.config 
WHERE loginname = 'login' 
AND SUBSTRING_INDEX(SUBSTRING_INDEX(`value`,',',-1),',',2) BETWEEN '2014-11-05 09:00:00' AND '2014-11-05 10:00:00';

值字段由逗号分隔值组成,例如' 1234,2014-11-05 00:00:00'

如何在休眠标准中转换它?有什么帮助吗?

修改

我尝试使用sqlRestriction,但没有查询结果。

DetachedCriteria dc = DetachedCriteria.forClass(Config.class);
dc.add(Restrictions.eq("loginname",loginname));   
dc.add(Restrictions.sqlRestriction("substring_index(substring_index(`value`,',',-1),',',2)
between ? and ?", new Object[]{startDate,endDate}, new
Type[]{StandardBasicTypes.DATE,StandardBasicTypes.DATE}));

1 个答案:

答案 0 :(得分:2)

你几乎就在那里。您已忘记{alias}。

  

使用给定的JDBC参数应用SQL表示的约束。任何出现的{alias}都将被表别名替换。

因此,您需要将value替换为{alias}.value

DetachedCriteria dc = DetachedCriteria.forClass(Config.class); 
dc.add(Restrictions.eq("loginname",loginname));

dc.add(
  Restrictions.sqlRestriction(
    "substring_index(substring_index({alias}.value,',',-1),',',2) between ? and ?",
     new Object[]{startDate,endDate},
     new Type[]{StandardBasicTypes.DATE,StandardBasicTypes.DATE}
  )
);

还删除额外的substring_index。他们会有相同的结果。

dc.add(
  Restrictions.sqlRestriction(
    "substring_index({alias}.value,',',-1) between ? and ?",
     new Object[]{startDate,endDate},
     new Type[]{StandardBasicTypes.DATE,StandardBasicTypes.DATE}
  )
);