是否冬眠转换column != null在HQL到column is null在SQL?
我有一个实体:
@Entity
@Table(name = "smsc.security_users")
public class User {
@Id
@Column(name = "id")
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "enabled")
private int enabled;
@Column(name = "master_id", nullable = true)
private Integer master_id;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "passwordExpiration")
private Date passwordExpiration;
public String getUsername() {
return username;
}
...
Run Code Online (Sandbox Code Playgroud)
我在说master_id.这是我的DAO方法:
public void add(String userName, String password, Integer master_id) {
Session session = null;
session = this.sessionFactory.getCurrentSession();
Query query = …Run Code Online (Sandbox Code Playgroud) 我正在使用 hibernate 将记录(即对象)保存到数据库中。在保存我的对象之前,我想验证数据库是否已经包含这个对象。(主键只是一个增量键,不能用于此目的。)
我正在运行时创建一个 HQL 语句来检查具有这些属性的记录的存在(即column1-3)。
结果查询应如下所示:
from myTable where column1 is null and column2 = :column2 and column3 = :column3'
Run Code Online (Sandbox Code Playgroud)
因为有时列可以包含空值,我检查属性的值,如果它是空值,那么我在这个查询中使用 ais而不是 a =(例如column1 is :column1在上面的语句中)。
因为我开始意识到我正在做很多工作来实现一些相对重要的事情,我开始怀疑我是否在正确的轨道上。有没有更简单的方法来检查对象的存在?
编辑:我稍微改写我的问题后,我意识到,也 column1 is :column1当不工作:column1参数设置为null。显然,似乎按预期工作的唯一语法是column1 is null. 因此,似乎您在搜索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 而不会在休眠状态下对其进行错误处理?
在数据库中,该字段可以为空。