Я написал hql, который корректно работает в редакторе Hql, но когда я применяю его в java-коде, это выдает ошибку.
HQL Query, который работает правильно
select auhority.id from Authority as auhority where auhority.action = 'USER_MASTER_FULL_ACCESS' and auhority.aclObject is NULL
Java-код для выполнения запроса
String hql = "from " + Authority.class.getCanonicalName() + " as model where model." + Authority.ACTION + " = ? and model." + Authority.ACL_OBJECT + " is null";
Query query = getSession().createQuery(hql);
query.setParameter(0, action);
List<Authority> list = query.list();
return list;
Здесь SecuredObject - это ACL_OBJECT, который является внешним ключом для таблицы Authority, которая может быть нулевой.
В противном случае другие вещи, например, добавить, обновить и удалить работает правильно.
Я использую MsSqlserver 2005 для базы данных.
Это дает мне ошибку, как следует
org.hibernate.TransientObjectException: object references an unsaved transientinstance - save the transient instance before flushing: com.xxxxx.xxxx.xxxx.SecuredObject
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:265)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:295)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3403)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:520)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:230)....