分类:
Java
标签:
hql
jpql
占位符
Unresolved property path
unexpected AST node
hql,即hibernate query language,使用面向对象的方式书写sql语句,jpql,Java Persistence Query Language,主要用于jpa,而hibernate是jpa的一种实现,所以其实hql也可以说是jpql的一种实现,两者用法基本一致。
为了避免直接拼写hql,造成sql注入,我们写hql的时候,必须使用绑定变量的方式进行赋值。hql绑定变量有两种方式,一种是使用"?"占位符,根据"?"出现的顺序,提供参数,一种是使用变量名称的方式绑定。两种方式的示例:
String hql = "from Person p where p.id=?";
String hql = "from Person p where p.id=:id";
两种方式各有优势,都有相应地使用场景。
笔者要在这提的是变量绑定时需要注意的一个问题,如果变量里面包含".",将会
......
分类:
Java
标签:
hql
CURRENT_DATE
YEAR
1、问题背景:
有一个需求,统计网址访问量,需要分别统计昨天以及当月网址的访问数量。网址每次访问记录都已保存下来,访问时间使用日期时间类型,数据库是用的mysql,对应的字段类型是timestamp。其实这是一个很简单的sql,指定时间范围count一下就行了,本来系统框架使用的hibernate,也支持jdbc,但是考虑到还是保留数据库可移植性,还是使用hql来进行查询。
2、解决方案:
2.1、方案1:
以统计昨天的访问量为例,给定两个时间类型的参数,分别对应昨天零点以及今天零点的时间,采用between进行查询。(传参时,参数类型好像是用使用java.sql.Date,笔者未试验)
2.2、方案2:
网上搜索hibernate支持的函数,找到一些处理时间类型的函数,笔者就是采用该方案实现,看下面代码:
public int getLastDayVisitCount() {
......
分类:
Java
数据库
标签:
countingsort
count
hql
项目中经常会有一个BaseDao,所有Dao都会继承这个BaseDao然后实现各自的Dao接口,BaseDao主要是封装了所有Dao通用的方法,其中就有分页查询。
分页查询每次会执行两个sql,首先一个sql用来统计总记录数,第二个sql才是分页查询指定数据。这是常用的一个方法,至少笔者所接触的项目基本都这么做的,至今还是没碰到过什么问题。
但如果hql语句包含distinct时,发现查询出来的记录总数不对,会大于实际记录数。