【问题标题】:Ebean: Setting a List<String> for setParameter() in RawSqlEbean:在 RawSql 中为 setParameter() 设置 List<String>
【发布时间】:2014-01-31 02:01:29
【问题描述】:

在 Play 应用程序 (2.2.x) 中,我使用 RawSql 来获取对象,但出现以下异常:

Execution exception[[PersistenceException: No ScalarType registered for class java.util.ArrayList]]

我的模型基本上看起来像

@Entity()
public class Metadata extends Model {
    public static Model.Finder<String, Metadata> find = new Model.Finder<String, Metadata>(String.class, Metadata.class);

    @Id
    public String recordID;

    @ManyToMany(cascade = CascadeType.REMOVE)
    public List<Keyword> keywords = new ArrayList<Keyword>();
}

和

@Entity
public class Keyword extends Model {
    @Id
    public String keyword;

    public static Model.Finder<String, Keyword> find = new Model.Finder<String, Keyword>(String.class, Keyword.class);

}

还有一个小助手豆

@Entity()
@Sql()
public class RecordId extends Model {
    @Id
    public String recordId;
}

现在我想查找所有具有关键字列表的记录。所以我写了一个RawSql,看起来像这样

SELECT metadata_record_id as recordId
FROM metadata_keyword
WHERE keyword_keyword IN (?)
GROUP BY recordId
HAVING count(recordId) = ?
ORDER BY recordId

在我的控制器中,我使用 setParameter 来填充参数。

RawSql rawSql = RawSqlBuilder.parse(sql).create();
List<RecordId> query = Ebean.find(RecordId.class).setRawSql(rawSql)
                .setParameter(1, stringList)
                .setParameter(2, stringList.size())
                .findList();

我在这里缺少什么?将字符串列表转换为逗号分隔的字符串不起作用,这是我所期望的。我可以只连接查询字符串而不使用 setParameter(),但我想这很容易(至少在理论上)sql 注入。

【问题讨论】:

    标签: java playframework ebean playframework-2.2


    【解决方案1】:

    我知道这已经很老了,您会继续前进,但是, 就是这一行

    关键字关键字在哪里 (?)

    去掉两侧的 ( )。 那应该这样做。

    而且最好给它们命名而不是这样使用。

    【讨论】:

    • 谢谢。即使是迟到的答案也可能对其他人有所帮助,所以不用担心。但如果我没记错的话,我试过了,但没有用。但我可能记错了。
    • 很遗憾听到这个消息,我会在某个时候重新测试并更新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多