1、select 所有列
HQL里没有 select *,可以写成 select O
如果select后,涉及到实体类的操作,则 select时候不能 select 列名1,列名2。。。。,必须select O
3、在JPA里执行 原生SQL
Query q = entityManager .createNativeQuery();
-------------此时 q.setParameter需要用"?1"代替":xx",q.setParameter(1, ID);
也可不加数字,直接用问号
-------------返回的数据通常带“[xx]”,需去掉括号
也可以用TO_CHAR(count(*))把数字强制转化成文本,再取回,就没有括号啦
不处理会有java.math.decimal转化String的异常?
-------------有时候内连接查不到数据,改成嵌套查询
-------------会自动取消所有查询语句中的单引号,但也不会出错
5、关于count(o)
Query q = entityManage.crQuery("select count(o) from ....");
... ...
return (Integer) q.getSingleResult();//这样转化不行,提示long不能转化为int
return Integer.parseInt(q.getSingleResult().toString());//要先转为字符串
4、获得数据库连接,执行任何SQL
a、获取数据库连接
执行原生态SQL语句,与用JDBC是一样的。只不过AOM里的数据源可以用JNDI查找。
b、其中的JNDI_NAME为数据源配置文件中配置的数据库连接的jndi-name
得到Connection之后就跟JDBC一样了。
http://www.operamasks.org/forum/viewthread.php?tid=4860&extra=&highlight=hql&page=2
5、关于缓存
使用crQuery(update、delete)数据后,会自动更新缓存
使用 crNativeQuery(update、delete)数据后,不会更新缓存,要手动更新
禁用某张表的缓存:
@Cacheable(false)
@Table(name = "MWT_THESIS")
禁用某次查询的缓存
Query q = entityManager.createQuery("SELECT o FROM thesis o WHERE " + query);
q.setHint("javax.persistence.cache.storeMode", "REFRESH");
失效所有表的缓存:
( (JpaEntityManager) entityManager.getDelegate() ).getServerSession().getIdentityMapAccessor().invalidateAll();
失效指定表的缓存:
( (JpaEntityManager) entityManager.getDelegate() ).getServerSession().getIdentityMapAccessor().invalidateClass(thesis.class);
6、查询部分字段
在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。
2.只查询一个字段,默认情况下,list中封装的是Object对象。
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。------------已验证,可直接取数组中字段
对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。比较简单的解决方法是:
在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。
hql查询多表部分字段:
select new 包名.表1实体类名(表1.属性1,表2.属性2……) from 表1实体类,表2实体类 where 表1.ID=表2.ID(即相关联的字段),同时在要返回的表1实体类中添加表2的属性和带参的构造方法,参数的个数和顺序与(表1.属性1,表2.属性 2……) 保持一致
6、实体属性的类型
字段如设置为int,则用到该字段的方法中的参数也要int,如public user queryByID(int ID);
使用起来很麻烦,不如都为string?
7、eclipseLink日志
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging
6、学习
ernate中用hql查询部分字段 http://wxinpeng.iteye.com/blog/1231105