Hibernate中使用select count(*) 或者sum(filed_name)(转)

本文介绍了在Hibernate中使用SQLQuery进行聚合查询如count或sum时返回的BigInteger类型如何转换为int类型的方法。

转自:http://blog.youkuaiyun.com/yangzhihello/article/details/8253320

在hibernate中使用SQLQuery查询select count()或者使用 select sum(filed_name)

返回的结果会是BigInteger等类型。

而这些是不能够强制转换为Object或者是Integer类型。

真的是很麻烦!

但是BigInteger中有invalue()方法。

可以自己转换为int类型。

所有已会有了下面的代码!

 

	long result  = (Integer)this.getHibernateTemplate().execute(new HibernateCallback() {
			
	public Object doInHibernate(Session session) throws HibernateException,
		SQLException {
		SQLQuery query = session.createSQLQuery(hql);
		BigInteger bigVal =(BigInteger)query.list().get(0);
		int val = bigVal.intValue();
		return val;
		}
	});

 

OBJECTANALYSTIC_MOVEMENTS *movements_attr[MAX_OBJ_NUM]; OBJECTANALYSTIC_VEHICLE_VALUE *vehicle_xml_info = [MAX_OBJ_NUM]; CELLMOTIONENGINE_VALUE *cellmotion_xml_info = malloc(sizeof(CELLMOTIONENGINE_VALUE) * MAX_OBJ_NUM); OBJECTANALYSTIC_HUMAN_VALUE *human_xml_info = [MAX_OBJ_NUM]; printf("iput data total len %d\n", bytes); u_int8_t objnum = 0; while ((offset < header.payload_length) && (objnum < MAX_OBJ_NUM)) { // 解析第二层头obj_id和obj_length CHECK_OFFSET(sizeof(uint16_t)); uint16_t obj_seq = ntohs(*(uint16_t *)(p_buf + offset)); // 第几个物体 offset += sizeof(uint16_t); objnum++; printf("start parse smart, the obj seq is at : %d \n", obj_seq); CHECK_OFFSET(sizeof(uint32_t)); uint32_t obj_legth = ntohl(*(uint32_t *)(p_buf + offset)); offset += sizeof(uint32_t); printf("start parse smart , the obj_legth is: %d\n", obj_legth); u_int16_t width = 0; u_int16_t height = 0; u_int16_t tp_x = 0; u_int16_t tp_y = 0; u_int32_t objid = 0; while (offset < offset + obj_legth) // 解析attribute { atrrtype = *(p_buf + offset++); if (atrrtype == 0) // 时空属性 { CHECK_OFFSET(sizeof(uint32_t)); attrlen = ntohl(*(uint32_t *)(p_buf + offset)); printf("parse timeandlocation and the attrlen is %d\n", attrlen); offset += sizeof(uint32_t); // attrlen offset += FILED_HEADER_TOTAL_LEN; objid = ntohl(*(uint32_t *)(p_buf + offset)); offset += sizeof(uint32_t); offset += FILED_HEADER_TOTAL_LEN; tp_x = ntohs(*(uint16_t *)(p_buf + offset)); offset += sizeof(uint16_t); offset += FILED_HEADER_TOTAL_LEN; tp_y = ntohs(*(uint16_t *)(p_buf + offset)); offset += sizeof(uint16_t); } if (atrrtype == 1) // 运动属性不能跳过需要获取物体种类 { CHECK_OFFSET(sizeof(uint32_t)); attrlen = ntohl(*(uint32_t *)(p_buf + offset)); offset += sizeof(u_int32_t); printf("start parse movement, and movement attrlen is %d\n", attrlen); int newoff = parse_smart_movement(p_buf, attrlen + offset, offset, &movements_attr[objnum]); if (newoff > 0) { offset = newoff; } if (movements_attr[objnum] != NULL) { if (movements_attr[objnum]->type) { cellmotion_xml_info[objnum]->objecttype = movements_attr[objnum]->type; cellmotion_xml_info[objnum]->is_motion = 1; width = movements_attr[objnum]->size_width; printf("movements_attr width is %d \n", width); height = movements_attr[objnum]->size_height; printf("movements_attr height is %d \n", height); } }这段代码中指针有用错吗
最新发布
10-23
在您提供的代码片段中,确实存在几个指针使用问题,需要特别注意: 1. **主要指针问题**: ```c CELLMOTIONENGINE_VALUE *cellmotion_xml_info = malloc(sizeof(CELLMOTIONENGINE_VALUE) * MAX_OBJ_NUM); // ... cellmotion_xml_info[objnum]->objecttype = ... // 错误!应该用 . 而不是 -> ``` `cellmotion_xml_info` 是一个指向 `CELLMOTIONENGINE_VALUE` 数组的指针,所以访问数组成员应该使用 `.` 而不是 `->`。 2. **数组初始化问题**: ```c OBJECTANALYSTIC_VEHICLE_VALUE *vehicle_xml_info = [MAX_OBJ_NUM]; // 错误语法 OBJECTANALYSTIC_HUMAN_VALUE *human_xml_info = [MAX_OBJ_NUM]; // 错误语法 ``` 这种数组初始化语法是错误的,应该使用 `malloc` 或者直接定义为数组。 3. **修正后的代码**: ```c // 正确分配方式 CELLMOTIONENGINE_VALUE *cellmotion_xml_info = malloc(sizeof(CELLMOTIONENGINE_VALUE) * MAX_OBJ_NUM); OBJECTANALYSTIC_VEHICLE_VALUE vehicle_xml_info[MAX_OBJ_NUM]; // 或者用 malloc OBJECTANALYSTIC_HUMAN_VALUE human_xml_info[MAX_OBJ_NUM]; // 或者用 malloc // 正确访问方式 if (movements_attr[objnum] != NULL) { if (movements_attr[objnum]->type) { // 这个是正确的,因为movements_attr是指针数组 cellmotion_xml_info[objnum].objecttype = movements_attr[objnum]->type; // 使用 . 而不是 -> cellmotion_xml_info[objnum].is_motion = 1; width = movements_attr[objnum]->size_width; height = movements_attr[objnum]->size_height; } } ``` 4. **其他潜在问题**: - 没有检查 `malloc` 返回值是否为 NULL - `movements_attr` 数组元素在使用前可能未初始化 - `objnum` 在循环中递增,但没有检查是否会超过 `MAX_OBJ_NUM` 5. **建议的完整修正**: ```c // 1. 正确定义指针和数组 OBJECTANALYSTIC_MOVEMENTS *movements_attr[MAX_OBJ_NUM] = {NULL}; // 初始化为NULL OBJECTANALYSTIC_VEHICLE_VALUE vehicle_xml_info[MAX_OBJ_NUM] = {0}; CELLMOTIONENGINE_VALUE *cellmotion_xml_info = malloc(sizeof(CELLMOTIONENGINE_VALUE) * MAX_OBJ_NUM); OBJECTANALYSTIC_HUMAN_VALUE human_xml_info[MAX_OBJ_NUM] = {0}; if (!cellmotion_xml_info) { printf("Memory allocation failed\n"); return -1; } // 2. 在使用前检查指针 if (objnum < MAX_OBJ_NUM && movements_attr[objnum] != NULL) { cellmotion_xml_info[objnum].objecttype = movements_attr[objnum]->type; // 使用点操作符 cellmotion_xml_info[objnum].is_motion = 1; // ... 其他赋值 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值