问题如下,我有一个带有列的实体..说:
@Getter
@Setter
@Column(name = "COLUMN_NAME", nullable = true)
private Boolean flag;
如您所见,类型为布尔值。在数据库中,它是一个数字列(NUMBER(1,0))。我正在尝试通过hibernate jpa在表中执行select和insert,因此select是一个存储库find,而insert是一个saveAndFlush。 这是选择:
public static final String query = "SELECT mgb FROM Entity mgb WHERE "
+ "( "
+ "("
+ "mgb.flag= :flag"
+ ") OR "
+ "(:flag IS NULL)"
+ ") AND "
+ "mgb.otherColumn IS NULL";
@Query(query)
public List<Entity>find(@Param("flag") Boolean flag);
这是插入:
Entity mgbi = new Entity();
mgbi.setFlag(null);
EntityRepository.saveAndFlush(mgbi);
这两个操作都给我带来了同样的异常;
2014-11-26 17:50:25,279 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - <SQL Error: 17004, SQLState: 99999>
2014-11-26 17:50:25,280 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - <Invalid column type: 16>
我做了一些尝试,我发现如果我改变这一行:mgbi.setFlag(null);
到mgbi.setFlag(true);
,则不再抛出错误并且插入正确完成。
我在网上发现boolean
类型在java中存在这个问题,但我使用的Boolean
不应该这么奇怪..而且,最后但并非最不重要,我是一个其他实体,在同一个数据库中具有几乎相同的列(甚至名称相同),从java和db(oracle)的角度来看涉及相同的数据类型,它没有不给我任何错误..
所以我很困惑..
如果有人能指出我正确的方向,我会很高兴..
答案 0 :(得分:4)
本周我在执行始终有效的更新时遇到了相同的异常消息。更改的是我将JBoss从6.0.1.Final升级到EAP-6.3,后者还附带了新版本的hibernate。
要解决这个问题,我只需更改属性的值&#34; hibernate.dialect&#34;来自&#34; org.hibernate.dialect.OracleDialect&#34; to&#34; org.hibernate.dialect.Oracle 9i Dialect&#34; on persistence.xml。
答案 1 :(得分:0)
我建议使用Hibernate支持的SQL coalesce函数:
public static final String query = "SELECT mgb FROM Entity mgb WHERE "
+ "mgb.flag = coalesce(:flag, mgb.flag) "
+ "AND mgb.otherColumn IS NULL";
它首先返回参数中的NULL值。