关于hql的update语句问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于hql的update语句问题相关的知识,希望对你有一定的参考价值。

String hql = "update Sys_user set sys_role.roleId=? where usrId=?";

需要修改的是Sys_user实体类的roleid属性,但在Sys_user实体类中这个属性是个Sys_role对象,这里语句该怎么写?

sys_role的结构是怎么样的?
你可以把这个对象转换成流存
或者把它分开新建一张表用来存放sys_role
如果是新项目建议用第二种方法追问

private Long roleId;
private String roleName;
private String roleDesc;
private Integer roleFlag;
private Set sys_users = new HashSet(0);

第二种来不及了,这是Sys_role里面的所有属性

追答

让sys_role对象继承Serializable接口 ,获得流 写入数据库
我没试过不过是可以的,你自己查查Serializable的资料
我上次也遇到了这个问题,不过里面变量比较少
我直接将他转换成string字符串 用空格隔开存入数据库,得到的时候重新组织
建议用Serializable 第二种方法不方便

追问

啊?这里不需要这样,不是,你只要告诉我这里的hql语句就可以了.

追答

我理解错了 你这个是一对多的问题

你这样写已经对了 数据库中的表更实体是不一样的
在数据库中Sys_user表中存在roleId属性

String hql = "update Sys_user set roleId=? where usrId=?"; 这句是改Sys_user表的(更改user的role)
如果你要改sys_role表(对某个用户的对应role该id)再追问(不过应该不可能)

追问

还是报错.com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'roleId' 无效。

参考技术A 有点不明白你的意思……
不过,最好还是用类似编译的sql的语句。像这样:
string
hql
=
"update
web
w
set
w.littlewarm=?
w.noticepic=?
w.help=?
where
w.id
=?";
query
q
=
session.createquery(hql);
q.setstring(0,littlewarmvalue);
q.setbyte(1,noticepicvalue);
q.setstring(2,helpvalue);
q.setinteger(3,idvalue);
q.executeupdate();
其中littlewarmvalue,noticepicvalue,helpvalue,idvalue可以通过参数传递过来。
不知道是不是你要的答案,希望对你有帮助。

能讲讲 hql 语句么?

Hibernate Query Language (HQL) .
Criteria提供了更加符合面向对象编程模式的查询封装模式。不过,HQL(Hibernate
Query Language)提供了更加强大的功能

下面是一组HQL的例子,代码中的s都代表Nhibernate的Session

统计个数
1.用select方法统计(去除了重复)
s.CreateQuery("select count(distinct a.id) from Animal a").UniqueResult()

s.CreateQuery("select count(*) from Animal").UniqueResult();
2.用where 方法统计
s.CreateQuery("select count(a.id) from Animal a having count(a.id)>1").UniqueResult();

统计平均数
1.用select方法统计
s.CreateQuery("select avg(a.BodyWeight) from Animal a").UniqueResult();
2.用where 方法统计
s.CreateQuery("select avg(a.BodyWeight) from Animal a having avg(a.BodyWeight)>0").UniqueResult();

取 最大/最小值/合计 的例子和上面的例子类似,只是avg可以换成 max,min,sum

返回一个指定的类
假设你有一个类:SummaryItem即统计类,你要返回一个列表的统计结果,你可以
s.CreateQuery("select distinct new SummaryItem(a.Description, sum(BodyWeight)) from Animal a").List<SummaryItem>()

在HQL中进行计算
s.CreateQuery("select a.Id, sum(BodyWeight)/avg(BodyWeight) from Animal a group by a.Id having sum(BodyWeight)>0").List()

很难得HQL还有SubString Locate Trim Length Bit_length Coalesce Upper等字符计算功能,你可以

SubString
hql = "select substring(a.Description, 3) from Animal a";
或者
hql = "from Animal a where substring(a.Description, 2, 3) = 'bcd'";

hql = "from Animal a where substring(a.Description, 2, 3) = ?";
s.CreateQuery(hql).SetParameter(0, "bcd").UniqueResult();

Locate
hql = "select locate('bc', a.Description, 2) from Animal a";

hql = "from Animal a where locate('bc', a.Description) = 2";

Trim
hql = "select trim(a.Description) from Animal a where a.Description=' def'";

hql = "from Animal a where trim(a.Description) = 'abc'";

hql = "from Animal a where trim(leading from a.Description) = 'def'";

hql = "from Animal a where trim(both from a.Description) = 'abc'";

Length
hql = "select length(a.Description) from Animal a where a.Description = '1234'";
hql = "from Animal a where length(a.Description) = 5";

Bit_length
hql = "select bit_length(a.Description) from Animal a";
hql = "from Animal a where bit_length(a.Description) = 24";

Coalesce
hql = "select coalesce(h.NickName, h.Name.First, h.Name.Last) from Human h";
hql = "from Human h where coalesce(h.NickName, h.Name.First, h.Name.Last) = 'max'";

Upper,Lower例子类似

类型转换的例子

Cast
hql = "select cast(a.BodyWeight as Double) from Animal a";
hql = "select cast(7+123-5*a.BodyWeight as Double) from Animal a";
hql = "from Animal a where cast(a.BodyWeight as string) like '1.%'";

str
hql = "select str(a.BodyWeight) from Animal a";
hql = "from Animal a where str(123) = '123'";

很难得HQL还有Nullif等判断功能,你可以

Nullif
hql1 = "select nullif(h.NickName, '1e1') from Human h";
hql2 = "from Human h where not(nullif(h.NickName, '1e1') is null)";

很难得HQL还有Abs Mod Sqrt等数学函数功能,你可以

Abs
hql = "select abs(a.BodyWeight*-1) from Animal a";
hql = "from Animal a where abs(a.BodyWeight*-1)>0";
hql = "select abs(a.BodyWeight*-1) from Animal a group by abs(a.BodyWeight*-1) having abs(a.BodyWeight*-1)>0";

Mod
hql = "select mod(cast(a.BodyWeight as int), 3) from Animal a";
hql = "from Animal a where mod(20, 3) = 2";
hql = "from Animal a where mod(cast(a.BodyWeight as int), 4)=0";

和时间相关的例子

hql = "select second(current_timestamp()), minute(current_timestamp()), hour(current_timestamp()) from Animal";
hql = "select day(h.Birthdate), month(h.Birthdate), year(h.Birthdate) from Human h";

原文地址:http://blog.csdn.net/educast/article/details/6411864
参考技术A hql 语句和sql相类似 但是 hql 是一字符串 他可以通过一个方法将其转成sql来执行 参考技术B 据说复杂的语句用hql不好控制

以上是关于关于hql的update语句问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Hibernate读和写操作属性链接的问题

关于spring data 中CrudRepository 查询 怎么写@query中hql语句

hibernate 一对多update操作的hql语句怎么写?

HQL查询语句

这个update的HQL怎么写

关于Oracle update set 语句的语法