我有这样的查询。
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}));
答案 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}
)
);