return sessionFactory.getCurrentSession().
createQuery("FROM Weather WHERE city_id = :id AND date " +
"BETWEEN now()::date AND now()::date + (:days - 1)").
setInteger("id", city_id).setString("days", days).list();
Run Code Online (Sandbox Code Playgroud)
得到错误:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: :
Run Code Online (Sandbox Code Playgroud)
如何在HQL中使用此语法?
基本上问题是我想在我的查询中使用冒号(:),但是当hibernate看到冒号时,它认为它是一个参数(:parameterName是HQL中参数的语法),正如你从我的2个用途中看到的那样(:id and :days).
但是当我使用now():: date语句时,它是特定的postgreSQL语法,hibernate破坏了一切.
我需要事先将未实现接口的枚举映射到现有数据库,现有数据库使用枚举将枚举存储在与所有者类相同的表中@Enumerated(EnumType.STRING).
class A {
HasName name;
}
interface HasName {
String getName();
}
enum X implements HasName {
John, Mary;
public String getName() { return this.name(); }
}
enum Y implements HasName {
Tom, Ann;
public String getName() { return this.name(); }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下应该如何处理映射?持久化到数据库不会改变,因为实现接口的所有枚举都会有不同的值,但我不确定如何从数据库中检索对象(我是否需要一个自定义映射器,它将尝试实例化一个枚举使用指定的枚举类?Hibernate本身是否支持此功能?).
我正在尝试将名为transmission_result的postgres自定义类型映射到Hibernate/JPA POJO.postgres自定义类型或多或少是枚举类型的字符串值.
我创建了一个名为PGEnumUserType的自定义EnumUserType以及一个表示postgres枚举值的枚举类.当我对一个真正的数据库运行时,我收到以下错误:'错误:列"状态"的类型为transmission_result,但表达式的类型为字符变化提示:您需要重写或转换表达式.位置:135'
看到这个,我想我需要将我的SqlTypes更改为Types.OTHER.但这样做会破坏我的集成测试(在内存数据库中使用HyperSQL)和消息:'引起:java.sql.SQLException:在语句中找不到表[select enrollment0 _."id"as id1_47_0_,enrollment0 _."tpa_approval_id"as tpa2_47_0_ ,enrollment0 _."tpa_status_code"as tpa3_47_0_,enrollment0 _."status_message"as status4_47_0_,enrollment0 _."approval_id"as approval5_47_0_,enrollment0 _."transmission_date"as transmis6_47_0_,enrollment0 _."status"as status7_47_0_,enrollment0 _."transmit"as transmit8_47_0_ from"传输"enrollment0_ where enrollment0 _."id"=?]'
我不确定为什么更改sqlType会导致此错误.任何帮助表示赞赏.
JPA/Hibernate实体:
@Entity
@Access(javax.persistence.AccessType.PROPERTY)
@Table(name="transmissions")
public class EnrollmentCycleTransmission {
// elements of enum status column
private static final String ACCEPTED_TRANSMISSION = "accepted";
private static final String REJECTED_TRANSMISSION = "rejected";
private static final String DUPLICATE_TRANSMISSION = "duplicate";
private static final String EXCEPTION_TRANSMISSION = "exception";
private static final String RETRY_TRANSMISSION = "retry";
private Long transmissionID;
private …Run Code Online (Sandbox Code Playgroud) 我正在使用基于hibernate 4和xml的映射.这是我得到的例外
Caused by: org.hibernate.MappingException: Unable to instantiate custom type: org.hibernate.type.EnumType
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:193)
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:179)
at org.hibernate.type.TypeFactory.byClass(TypeFactory.java:103)
at org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:130)
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:307)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:294)
at org.hibernate.mapping.Property.isValid(Property.java:238)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469)
at org.hibernate.mapping.RootClass.validate(RootClass.java:270)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1294)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1742)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1788)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:189)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:350)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:335)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$6.run(AbstractAutowireCapableBeanFactory.java:1504)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1502)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 35 more
Caused by: java.lang.NullPointerException
at org.hibernate.type.EnumType.setParameterValues(EnumType.java:153)
at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:131)
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:189)
... 53 more
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的枚举映射
<property name="coachingStatus" column="status" update="true" insert="true" index="true">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">com.tutorial.enums.CoachingStatus</param>
<param name="type">12</param>
</type>
</property> …Run Code Online (Sandbox Code Playgroud) 我没有运气来使用hibernate(使用HSQLDB)查询.查询代码如下所示:
Query query = session.createQuery("from "+tableName+" where CURRENCY = :currency");
query.setParameter("currency",currency);
List<ExchangeRate> list = query.list();
Run Code Online (Sandbox Code Playgroud)
我一直得到"引起:org.hsqldb.HsqlException:转换中的数据类型不兼容":
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.loader.Loader.doList(Loader.java:2529)
at org.hibernate.loader.Loader.doList(Loader.java:2512)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
at org.hibernate.loader.Loader.list(Loader.java:2337)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1275)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at com.rockymountaineer.wsapi.db.test.ExchangeRateDAOTest.getRate(ExchangeRateDAOTest.java:27)
at com.rockymountaineer.wsapi.db.test.ExchangeRateDAOTest.main(ExchangeRateDAOTest.java:39)
Caused by: java.sql.SQLSyntaxErrorException: incompatible data type in conversion
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.setBytes(Unknown Source)
at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$1.doBind(VarbinaryTypeDescriptor.java:57)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:93)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66)
at …Run Code Online (Sandbox Code Playgroud)