【问题标题】:How to create active object 'IN' condition query如何创建活动对象“IN”条件查询
【发布时间】:2013-05-16 07:43:05
【问题描述】:

我当前的查询如下,它适用于单个用户:

1
ao.find(da.class, Query.select().where("user=?",user)

现在,我想更改此查询以获取多用户数据,如下所示,但它不起作用并且给了我无效的列名。

1
ao.find(da.class, Query.select().where("user IN (?)",user)

另外,尝试通过应用单引号。即使是单个用户输入参数值也无法正常工作并给出相同的错误。

任何人都可以建议我有什么问题并且必须在这里更正吗?

错误为,

 Caused by: java.sql.SQLException: Column not found: user in statement [SELECT * FROM       PUBLIC.AO_0371A8_da WHERE "user" IN (?)]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.prep

OR when - where("used "('?')" 并为单个用户验证

at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: Column not found: user in statement [SELECT * FROM      PUBLIC.AO_0371A8_da WHERE "user" IN ('?')]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.prepareState

谢谢

【问题讨论】:

    标签: java conditional-statements hsqldb active-objects


    【解决方案1】:

    如果要使用 IN 查询,则需要自己构建占位符列表。这是一个 sn-p 取自:https://ecosystem.atlassian.net/browse/AO-263?focusedCommentId=69495&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-69495

    MyEntity[] findEntities(Iterable<String> matchValues) {
        String placeholderCommaList = Joiner.on(", ").join(Iterables.transform(matchValues, Functions.constant("?")));
        Object[] matchValuesArray = Iterables.toArray(matchValues, Object.class);
        return ao.find(MyEntity.class, "primary_key_field_name", Query.select().where("match_field_name IN (" + placeholderCommaList + ")", matchValuesArray));
    }
    

    重要的是,占位符(“?”)的数量与参数的数量相匹配。

    希望对你有帮助

    【讨论】:

    • 谢谢,但认真的,wtf。
    【解决方案2】:

    有两个问题。

    您不能使用 IN 子句中的一个参数从数据库中检索多行。此查询等效于第一个查询。两个用户需要 IN(?,?),三个用户需要 IN(?,?,?)。

    第二个查询给出错误可能是因为列名是 USER。为您的变量和数据库列尝试不同的名称。

    当您要求解决问题时,请务必报告错误。

    如果您无法更改用户字段名称,您可以引用它。但我不知道ORM是否改变了where字符串。

    ao.find(da.class, Query.select().where("\"USER\" IN (?)",user)
    

    【讨论】:

    • 有没有办法让它在不改变“用户”字段的情况下工作,对于使用第一个查询的单个用户来说它工作正常。但在用于多用户时不起作用 - where"(user IN (?)",userparam), userparam has multiple value - "user1,user2,user3"
    猜你喜欢
    • 2015-07-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2016-08-29
    相关资源
    最近更新 更多