如何将Hibernate参数设置为"null"?例:
Query query = getSession().createQuery("from CountryDTO c where c.status = :status and c.type =:type")
.setParameter("status", status, Hibernate.STRING)
.setParameter("type", type, Hibernate.STRING);
Run Code Online (Sandbox Code Playgroud)
在我的例子中,状态String可以为null.我调试了这个,然后hibernate然后生成一个像这样的SQL字符串/查询.... status = null但是这在MYSQL中不起作用,因为正确的SQL语句必须是" status is null"(Mysql不理解status = null并且计算这个为了没有任何记录将被返回查询,根据我读过的mysql文档...)
我的问题:
为什么没有Hibernate正确地将空字符串转换为"is null"(而且错误地创建"= null")?
重写此查询以使其为空安全的最佳方法是什么?使用nullsafe,我的意思是,如果"status"字符串为null,则应该创建"is null"?
非常感谢你!蒂姆
我不明白为什么 Hibernate 试图在它为空时将此字段设置为 VARBINARY。
Java 数据类型为 BigDecimal Oracle 数据类型为 Float
它是这样设置的:
entityManager.createNamedQuery("blah").setParameter("target_field", object.sourceValue)
Run Code Online (Sandbox Code Playgroud)
再次 - sourceValue 是一个 BigDecimal,当我调试它时,该值为空。
当它尝试执行此更新时,我收到 oracle 错误:
ORA-00932: inconsistent datatypes: expected NUMBER got BINARY
Run Code Online (Sandbox Code Playgroud)
这是控制台日志中此属性的显示内容:
o.h.type.descriptor.sql.BasicBinder : binding parameter [8] as [VARBINARY] - [null]
Run Code Online (Sandbox Code Playgroud)
如果我在执行更新之前在 Java 中做了这个愚蠢的 hack:
if (object.sourceValue == null) object.sourceValue = new java.math.BigDecimal(0);
Run Code Online (Sandbox Code Playgroud)
然后它运行良好。所以这个错误的原因绝对不是当字段为空时hibernate做错了什么。
我该如何解决这个问题,以便我可以将字段设置为 null 而不会在休眠状态下对其进行错误处理?
在数据库中,该字段可以为空。
我是Hibernate的新手,我正在尝试对我创建的oracle数据库进行"简单"用户插入.
我使用Netbeans Hibernate向导创建了所有必需的文件:hibernate.cfg.xml,hibernate,reveng.xml,Users.hbm.xml,Users.java
如果我使用oracle sql developer插入用户,我可以从java代码中获取此用户.但是,如果我试图插入用户,我会收到错误:不一致的数据类型:预期NUMBER得到了BINARY.
部分Users.hbm.xml:
<hibernate-mapping>
<class name="HibernateDB.Users" schema="SYSTEM" table="USERS">
<id name="userid" type="int">
<column name="USERID" precision="9" scale="0"/>
<generator class="increment"/>
</id>
...
Run Code Online (Sandbox Code Playgroud)
部分Users.java:
public class Users implements java.io.Serializable
{
private int userid;
private String username;
private String password;
private String firstName;
private String lastName;
private Serializable dateOfBirth;
private Serializable registrationDate;
...
Run Code Online (Sandbox Code Playgroud)
部分insertUser方法(所有参数都是字符串):
session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Calendar dOfBirth = Calendar.getInstance();
dOfBirth.set(Integer.parseInt(year_of_birth), Integer.parseInt(month_of_birth), Integer.parseInt(day_of_birth));
Calendar regDate = Calendar.getInstance();
Timestamp dOfBirthTS = new Timestamp(dOfBirth.getTimeInMillis());
Timestamp regDateTS = new …Run Code Online (Sandbox Code Playgroud)