sqlexception索引超出正确的sql语句

时间:2012-12-24 00:37:48

标签: mysql playframework-2.0 ebean

我有一个非常好的sql语句。但是在使用play 2.1的webapp中实现我得到了这个错误: javax.persistence.PersistenceException:查询抛出SQLException:列索引超出范围,0< 1。

我在这里找到了这个问题:Error executing 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;
}
经过大量的努力和挫折之后,我希望有人得到一个提示或解决方案。

1 个答案:

答案 0 :(得分: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.namee.description加载到模型值,错误消失了。 (当然我自己的查询有几个连接,并且比这更复杂,但基础是相同的。)

总结一下:发生此问题时,请检查您是否未加载任何内容(columnMapping),使用System.out.println(“”);或者类似于检查您的模型已经加载了哪些值。还要记住检查注释,例如“@JoinColumn”,它可能会在同一模型下加载更多数据 - 仅基于给定的e.id值。如果您不选择并将e.id设置为columnMapping值,则可能需要将所有需要的字段分别列为.. e.name, e.description ..

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