NamedQuery中的布尔包装器

时间:2015-04-24 14:11:20

标签: sql oracle

我使用Oracle SQL并有一个这样的表:

CREATE table MY_TABLE(
    MY_ID         RAW(16)                                NOT NULL CONSTRAINT MY_ID PRIMARY KEY,
    MY_BOOLEAN    NUMBER DEFAULT 1                       NOT NULL,
    MY_NAME       NUMBER                                 NOT NULL
);

MY_BOOLEAN可以是0(表示错误)或1(表示正确)。

我的应用可以使用NamedQuery搜索值。这看起来像这样:

import javax.persistence.NamedQuery;
...
@NamedQuery(
    name = "MyTable.listAllMatching",
    query = "SELECT COUNT(t) FROM MyTable t WHERE "
            + "LOWER(t.id) LIKE LOWER(:filter) OR "
            + "LOWER(t.myBoolean) LIKE LOWER(:filter) OR "
            + "LOWER(t.myName) LIKE LOWER(:filter)"
)

如果我搜索名称,它可以工作。如果我搜索true,我想获取MY_BOOLEAN1的所有行。 false0也是如此。我不能只搜索01,因为例如,当我搜索0时,我的0中的每一行都会MY_ID }。

是否有办法使用包装函数或其他任何内容将truefalse :filter转换为01仅用于{{ 1}?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您的查询应该有所不同。通过将MY_BOOLEAN和MY_NAME声明为数字,然后在查询中使用LOWER,您将导致数字显式转换为VARCHAR。试试这个

    query = "SELECT COUNT(t) FROM MyTable t WHERE "
        + "(LOWER(t.id) LIKE LOWER(:filter1) "
        + " OR LOWER(t.my_Name) LIKE LOWER(:filter1))"
        + " t.my_Boolean = :filter2"

通过在OR周围放置括号,您可以选择并使用MyBoolean作为数字比较,它可以作为整体过滤器

在重新阅读你想要做的事情后,我认为你需要两个过滤器,一个用于文本,声明为CHAR,一个用于MyBoolean和my_name。

除此之外,您可以通过不同的方式命名列来更清晰

my_name => my_name_id
my_boolean => enabled