【问题标题】:DetachedCriteria isNotEmpty for OracleOracle 的 DetachedCriteria isNotEmpty
【发布时间】:2018-06-24 06:58:06
【问题描述】:

我今天发现了以下问题。

当我使用分离标准时,例如detachedCriteria.add(Restrictions.ne(field, value)); 来检查字符串是否为空。我发现这不适用于oracle。

作为“IS NOT NULL”-检查对我来说还不够,我尝试复制

WHERE length(trim(COL_NAME)) > 0

在 Oracle 上工作的模式如下:

detachedCriteria.add(Restrictions.sqlRestriction(String.format("length(trim({%s}.%s)) > 0", aliasName, field)));

现在我得到以下标准条目(调试检查):

length(trim({testtable}.name.de)) > 0

其中testtable 是表名,name@Embedded 类,属性de@Embedabble 的属性。

它最终导致 NullPointerExcpetion....

Method threw 'java.lang.NullPointerException' exception.
0 = {StackTraceElement@32701} "oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:879)"
1 = {StackTraceElement@32702} "oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:881)"
2 = {StackTraceElement@32703} "oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)"
3 = {StackTraceElement@32704} "oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)"
4 = {StackTraceElement@32705} "oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)"
5 = {StackTraceElement@32706} "oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)"
6 = {StackTraceElement@32707} "oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)"
7 = {StackTraceElement@32708} "com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:174)"
8 = {StackTraceElement@32709} "org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)"
9 = {StackTraceElement@32710} "org.hibernate.loader.Loader.getResultSet(Loader.java:2065)"...

没有任何消息。谁能解释我做错了什么?

休眠:4.3.6.FINAL

【问题讨论】:

    标签: oracle hibernate restrictions detachedcriteria


    【解决方案1】:

    根据文档我自己找到了答案:

    sql限制
    public static Criterion sqlRestriction(String sql)

    应用以 SQL 表示的约束。任何出现的 {alias} 都会 替换为表别名。

    参数:
    sql -
    退货:
    标准

    我已经得出结论,我的代码应该如下所示:

    /**
     * Adds a constraint to the where clause checking if the specified field value's length is bigger than ZERO
     * @param sqlField the field of the table the query belongs to (in SQL Syntax not hql or something else)
     * @return Query
     */
    public final Query<T> isNotEmptySQLField(String sqlField){
        //Apply a constraint expressed in SQL. Any occurrences of {alias} will be replaced by the table alias.
        detachedCriteria.add(
              Restrictions.sqlRestriction(
                  String.format("length(trim({alias}.%s)) > 0", sqlField)));
        return this;
    }
    

    其中sqlFieldDATABASE 中列的NAME

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多