标签:hql

hql,jpql变量占位符不能出现.

发表于2年前(May 19, 2016 8:27:55 AM)  阅读 710  评论 0

分类: 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";

两种方式各有优势,都有相应地使用场景。

笔者要在这提的是变量绑定时需要注意的一个问题,如果变量里面包含".",将会

......

Hibernate支持的HQL函数-HQL对Date类型数据的处理

发表于3年前(Dec 24, 2014 2:34:59 PM)  阅读 1072  评论 0

分类: 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() {
......

HQL分页sql遇到distinct时count总数不对

发表于3年前(Dec 24, 2014 10:45:17 AM)  阅读 700  评论 0

分类: Java 数据库

标签: countingsort count hql

项目中经常会有一个BaseDao,所有Dao都会继承这个BaseDao然后实现各自的Dao接口,BaseDao主要是封装了所有Dao通用的方法,其中就有分页查询。

分页查询每次会执行两个sql,首先一个sql用来统计总记录数,第二个sql才是分页查询指定数据。这是常用的一个方法,至少笔者所接触的项目基本都这么做的,至今还是没碰到过什么问题。

但如果hql语句包含distinct时,发现查询出来的记录总数不对,会大于实际记录数。