0

我有一个运行良好的 sql 语句。但是在我的 webapp 中使用 play 2.1 实现时,我得到了这个错误:javax.persistence.PersistenceException: Query throw SQLException:Column Index out of range, 0 < 1。

我在这里发现了这个问题:Error execution MySQL query via ebean using RawSql 但后来我遇到了其他异常。

我正在尝试获取包含标签列表的标记线程(与堆栈溢出相同)。这里是sql语句

SELECT t.topic 
FROM topic t 
WHERE 3 = (SELECT COUNT( DISTINCT ta.id ) 
           FROM topic_tag tt 
           INNER JOIN tag ta ON ta.id = tt.tag_id 
           WHERE ta.name IN ('children', 'spain','new') 
           AND tt.topic_id = t.id ) 

在玩我这样做:

RawSql rawSql = RawSqlBuilder.unparsed(sqlString).create();
result =  find.setRawSql(rawSql).findList();

然后,我得到了越界异常。之后我尝试设置列映射:

RawSql rawSql = RawSqlBuilder.unparsed(sqlString)
            .columnMapping("t.topic","topic")
            .columnMapping("t.id","id")
            .columnMapping("ta.name","tagList.name")
            .columnMapping("ta.id","tagList.id")
            .create();

现在我得到一个空指针异常。可能是因为 ebean 无法从中创建查询。

这是我模型中的一些代码:

@Entity
public class Topic extends Model{

@Id
public Long id;

@Required
public String topic;

@ManyToMany
public List<Tag> tagList;
}


@Entity
public class Tag extends Model {

@Id
public long id;

@Required
public String name;
}

经过大量尝试和沮丧后,我希望有人对此有所提示或解决方案。

4

1 回答 1

0

我只是在类似的问题上浪费了几个小时,实际上我设法通过仅映射id某种模型的字段并选择较少数量的字段来解决它,之后自动加载其他值 - 所以基本上,如果我尝试选择值就会发生错误喜欢:

.. select e.id, e.name, e.description from exampleTable e ..并使用如下映射:

RawSql rawSql = RawSqlBuilder.parse(sql)
// map the sql result columns to bean properties
.columnMapping("e.id", "exampleModel.id")
.columnMapping("e.name", "exampleModel.name")
.columnMapping("e.description", "exampleModel.description")
.create();

当我更改为仅选择e.id并映射时:

RawSql rawSql = RawSqlBuilder.parse(sql)
// map the sql result columns to bean properties
.columnMapping("e.id", "exampleModel.id")
.create();

它也加载e.name并且e.description模型值和错误消失了。(当然我自己的查询有几个连接,比这复杂一点,但基本是一样的。)

所以总结一下:当这个问题发生时,检查你没有加载任何东西两次(columnMapping),使用 System.out.println(""); 或类似检查已为您的模型加载了哪些值。请记住还要检查诸如“@JoinColumn”之类的注释,这可能会在同一模型下加载更多数据 - 仅基于给定e.id值。如果您不选择并设置e.id为 columnMapping 值,那么您可能需要将所有需要的字段分别列出为.. e.name, e.description ..

希望这些发现可以帮助某人。

于 2013-02-12T14:40:02.430 回答