令牌SQL92不受支持

时间:2017-10-15 10:58:02

标签: java jdbc hibernate-criteria

我的应用程序使用sqlRestriction方法遇到了一些麻烦:

这是我的电影课:

public class Movie {

    @Id
    @Column(name = "pk")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "movie_seq")
    @SequenceGenerator(name = "movie_seq", sequenceName = "movie_seq", allocationSize = 1, initialValue = 1)
    public long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Column(name = "name")
    public String str_name = "";

...

}

当我做那样的事情(虚拟测试)时:

List<Movie> movies = session.createCriteria(Movie.class)
        .add(Restrictions.sqlRestriction("1 in (1)"))
        .list();

完美无缺。

我的第二次测试(更改限制):

.add(Restrictions.sqlRestriction("Movie.id in (166,171)"))

我的第三次测试

add(Restrictions.sqlRestriction("{Movie}.id in (166,171)"))

他们两个都以同样的方式失败:

ERROR: Token SQL92 no soportado en la posición: 345
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not extract ResultSet
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
    ...
Caused by: java.sql.SQLException: Token SQL92 no soportado en la posición: 345
    at oracle.jdbc.driver.OracleSql.handleODBC(OracleSql.java:1275)
    ...

我做错了什么?

被修改

我试过了:

.add(Restrictions.sqlRestriction("{alias}.id in (?, ?)", new Long[]{166L,171L}, new Type[]{Hibernate.Long, Hibernate.Long}) )

我得到了这个:“长期无法解决或不是一个领域”

似乎“Hibernate。{AnyType}”已弃用,请参阅此链接:Why Hibernate STRING can not be resolved?

我尝试了这个:

.add(Restrictions.sqlRestriction("{alias}.id in (?, ?)", new Long[]{166L,171L}, new Type[]{LongType.INSTANCE, LongType.INSTANCE}) )

但我收到了这个错误:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "THIS_"."ID": invalid identifier

2 个答案:

答案 0 :(得分:0)

不确定您是否正确使用别名。试试以下

Restrictions.sqlRestriction("{alias}.pk in (?, ?)", new Long[]{166L,171L}, new Type[]{Hibernate.Long, Hibernate.Long}) )

?的计数需要与给定数组的大小相同,因此应构建(?,?)&amp;根据传递的数组动态附加。以及类型数组。

编辑:ID字段名称不是id,而是pk,原始答案中错过了@Column(name = "pk")。较新的hibernate版本没有更多的Hibernate.Long&#39;但请改用LongType.INSTANCE

Restrictions.sqlRestriction("{alias}.pk in (?, ?)", new Long[]{166L,171L}, new Type[]{LongType.INSTANCE, LongType.INSTANCE}) )

答案 1 :(得分:0)

解决。 我使用的是hibernate表/字段名称的名称(我的意思是&#34; id&#34;)它被改为&#34; pk&#34;。它工作了!

$("#element").hide();
$("#element").show(1000);

我以为我必须使用HQL表/字段名称。但是phisicall表的名称/字段是正确的!