我有一个非常好的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;
}
经过大量的努力和挫折之后,我希望有人得到一个提示或解决方案。
答案 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.name
和e.description
加载到模型值,错误消失了。
(当然我自己的查询有几个连接,并且比这更复杂,但基础是相同的。)
总结一下:发生此问题时,请检查您是否未加载任何内容(columnMapping),使用System.out.println(“”);或者类似于检查您的模型已经加载了哪些值。还要记住检查注释,例如“@JoinColumn”,它可能会在同一模型下加载更多数据 - 仅基于给定的e.id
值。如果您不选择并将e.id
设置为columnMapping值,则可能需要将所有需要的字段分别列为.. e.name, e.description ..
希望这些发现可以帮助某人。