令牌SQL92

问题描述:

我使用sqlRestriction方法在我的应用程序一些麻烦:令牌SQL92

这是我的电影类:

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})) 

,我得到了这一点: “休眠{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 
+0

只是好奇是最新的'公共长ID或'公共长ID'?但似乎可能没有正确设置别名 – pirho

+0

最后只是检测到错误。我使用的是hibernate表名/字段名(我的意思是“id”),它被改为“pk”。它的工作! 。新增(Restrictions.sqlRestriction( “PK在(?,?)”,新龙[] {166L,171L},新类型[] {LongType.INSTANCE,LongType.INSTANCE})) 我想我有使用HQL表/字段名称。但是phisicall表的名字/字段是正确的! 回答你的问题:我使用这个: @Column(name =“pk”) public long id; 当然,我非常感谢你的帮助 – Lev

+0

。我错过了@Column(name =“pk”)'sqlRestriction'它是本地sql NOT JPQL:D。那么,学到了新的东西 – pirho

不知道。尝试以下

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

Count的?需要相同给定阵列的大小,因此(?,?)应所附动态基于通过在阵列上被构造&。以及类型数组。

编辑:id字段名称不是idpk,在origal答案错过@Column(name = "pk")。较新的hibernate版本没有更多'Hibernate.Long',而是使用LongType.INSTANCE

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

我试过了你的解决方案,但似乎“Hibernate.Long”已被废弃。我想我必须使用“LongType.INSTANCE”。但是,我收到了这个错误:“java.lang.ClassCastException:[J不能转换为java.lang.Long”,也许是因为它是一个数组..但是无论如何。我尝试只有一个值(没有数组):sqlRestriction(“{别名} .id =?”,166L,LongType.INSTANCE) 而我得到这个错误:ORA-00904:“这个_”。“ID”:无效标识符 – Lev

+0

是否工作,即使'Hibernate.Long'已被弃用?那么'Long.class'呢? – pirho

+0

对不起,我编辑了我的评论..回答你最后的评论。是的,它失败了。 “Hibernate.INTEGER无法解析”。它从哪个包导入? ¿进口org.hibernate.Hibernate? – Lev

已解决。 我使用的是hibernate表名/字段名称(我的意思是“id”),它被改为“pk”。它的工作!

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

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