hibernate中的布尔列类型(可为空)

时间:2014-11-26 17:06:44

标签: java oracle hibernate jpa

问题如下,我有一个带有列的实体..说:

@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)的角度来看涉及相同的数据类型,它没有不给我任何错误..

所以我很困惑..

如果有人能指出我正确的方向,我会很高兴..

2 个答案:

答案 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值。