现在的位置: 首页 > 综合 > 正文

HoL

2013年10月13日 ⁄ 综合 ⁄ 共 2774字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.