用Hibernate查询有下划线的表字段遇到的问题

本文介绍了一个物流项目中使用Seam+Spring+Hibernate技术栈遇到的问题:当使用包含下划线的字段作为查询条件时,Hibernate无法正确解析。通过在SQL语句中增加别名的方式解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正在用Seam+Spring+Hibernate开发一个物流相关的项目,下午QA发现了一个这样的问题:
当用某些字段作为条件查找的时候,会出错。后来经过查看Hibernate的log日志,发现Hibernate产生的Sql语句中凡是有下划线的都没有正确解析到:比如:

Entity Class Snippet:
private Float ctnnweight;
private Float ctngweight;

private Integer quantityPerCtn;
.............................
@Column(name = "quantity_per_ctn")
public Integer getQuantityPerCtn() {
return quantityPerCtn;
}

Action Class Snippet:
models = this.shippingDatabase
.createQuery(
"select distinct m from Model m left outer join m.agiles agile order by m.name asc")
.setMaxResults(pageSize).setFirstResult(page * pageSize).list();

..................................
..................................
if (!bUnw) {
sql.append(" and unitnweight=:unitnweight");
}
if (!bUgw) {
sql.append(" and unitgweight=:unitgweight");
}

if (!bQpre) {
sql.append(" and quantityPerCtn=:quantityPerCtn");
}

Table Structure:
id: varchar(255)
unitnweight: int
unitgweight: int
quantity_per_ctn: int

如果用unitnweight或unitgweight作为查询条件的或,没有问题。但是如果用quantityPerCtn的话,就会出现问题了。查看Hibernate产生的Sql语句中,发现Hibernate没有把quantityPerCtn正确映射成quantity_per_ctn。后来把sql修改为:

if (!bUnw) {
sql.append(" and m.unitnweight=:unitnweight");
}
if (!bUgw) {
sql.append(" and m.unitgweight=:unitgweight");
}

if (!bQpre) {
sql.append(" and m.quantityPerCtn=:quantityPerCtn");
}

注意,这个时候在每个field前加上了一个别名,就能够正确映射表的字段明了。因为前两个Entity类的field名和表的字段名是一样的,所以不同经过映射也能正确查找,而第三个field和数据表的字段名不对应,而又没有映射到的话,就会出现问题了。不过好像Hibernate在处理下划线的时候经常会出现问题,不知道用了以上方法之后能不能解决,还是另有他因,本人是个新手,有n多东西都还在探索当中啊,要多多努力加油!
这有个文章,或许有时候可以参考一下:
[quote]
控制时间 发表于: 2007-7-23 07:35 来源: 创意空间
很多朋友问我在使用Hibernate技术的时候如何解决数据下划线映射问题。网上有很多已经指出了解决方法!但是很多人还是不能搞定。我这里就把方法直接点说出来!给大家共享!
通过Hibernate映射数据后会发现带有下划线的字段被映射成了别的东西。比如有一个字段名称是这样的“u_name”那么Hibernate映射后其名称就变成了UName,观察对应的XML文件其中是这么定义的“<property name="UName" column="u_name" type="string" not-null="true" />”。打开相应的类文件查看。初次看完这个类后会发现没有问题,但是添加数据的时候会出错,错误如下:“Could not find a getter for UName in class com.table.Tone”错误说明了在com.table.Tone这个类里面找不到UName。
处理方法如下:1.修改XML文件将“UName”更换成“uname”注意是小写(当然这个名字可以自己定义了)。然后把对应类里面的私有成员变量 “private String UName;”改成“private String uname”并且替换所有名称为“UName”的地方。很多朋友到这里就卡住了,因为这样修改完毕后还是会报“Could not find a getter for UName in class com.table.Tone”错误。因为你只是修改了一半而已。2.还要替换与“UName”相关的set与get方法名称。(如果要问我为什么?那么我就要说你不了解Hibernate的处理机制就不要是用Hibernate了。浪费工具)。这样就完成了!运行吧!呵呵!
如果还有什么疑问可以跟贴!
[/quote]
Hibernate 中,虽然不像 SQL 直接那样设置字段注释,但你可以通过 Java 注解的方式在实体类中添加字段注释。对于字段类型修改,如果你在运行时发现需要更改,通常是不可能直接改变已有的数据库结构的,因为 Hibernate 会依据数据库映射的实体类生成表结构。 以下是具体的设置方式: 1. **字段注释**: 使用 `@Column` 注解可以为字段添加注释。例如: ```java @Entity public class YourEntity { /** * 这是一个字段的描述 */ @Column(name = "your_column_name", columnDefinition = "TEXT COMMENT '这是字段注释'") private String yourField; } ``` `columnDefinition` 属性用于提供额外的 SQL 字符串,这里也可以包含注释。 2. **修改字段类型**: 如果需要在运行时修改字段类型,这通常意味着你需要重构代码并手动调整数据库映射。首先删除旧的数据,然后更新实体类和实体管理器(EntityManager)中的映射,最后可能是需要迁移数据到新类型的字段。 ```java // 假设你想将 String 类型改为 Integer YourEntity yourEntity = entityManager.find(YourEntity.class, someId); yourEntity.setYourField(Integer.parseInt(yourEntity.getYourField())); ``` 然后在数据库层面,你可能需要手动更新表结构或者使用工具如 Liquibase 进行数据库迁移。 **重要提示**:频繁改动数据库结构应该谨慎对待,尽量在设计阶段就确定好,并考虑对现有系统的兼容性和迁移策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值