2016-03-11 41 views
1

我有兩個表(A和B):表中的一個是一些對象(A)的結構和其他通過多對多映射(B)連接兩個表A和表C的表。在表A中,我有必須使用表B計算的列。我如何使這個列在hibernate中自動計算?如何在數據庫計算表(hibernate)中創建值?

主要問題:如何在Hibernate中將列作爲查詢?

UPD:

我試圖@Formula註釋,並得到了org.hibernate.type.SerializationException: could not deserialize

你對這種情況有一些想法嗎?

該字段的代碼如下所示:

@Formula("(select count(t.first_id) from " + TABLE_NAME + " as t group by t.second_id)") 
private int count; 

setCount(...); 
... getCount(); 

堆棧跟蹤:

org.hibernate.type.SerializationException: could not deserialize 
     at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:243) 
     at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:287) 
     at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:138) 
     at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:113) 
     at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:27) 
     at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:53) 
     at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) 
     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:241) 
     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:237) 
     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:227) 
     at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:303) 
     at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2726) 
     at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1728) 
     at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1654) 
     at org.hibernate.loader.Loader.getRow(Loader.java:1543) 
     at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:727) 
     at org.hibernate.loader.Loader.processResultSet(Loader.java:972) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:930) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
     at org.hibernate.loader.Loader.doList(Loader.java:2611) 
     at org.hibernate.loader.Loader.doList(Loader.java:2594) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423) 
     at org.hibernate.loader.Loader.list(Loader.java:2418) 
     at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109) 
     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1716) 
     at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363) 
     at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:385) 

回答

1

您可以使用@Formula註釋和定義實體領域的基礎上計算的SQL表達式。

@Formula(" select count(*) from C where C.dependent_id=id") 
public int expressionCount; 

其中id是在實體映射

+0

謝謝你的回答,但我已經試過了,得到了'org.hibernate.type.SerializationException:無法反序列化'。 你對這種情況有一些想法嗎? 我對此提出質疑的代碼。 – Timofey

+0

可能會與設置字段和方法的註釋問題http://stackoverflow.com/questions/13253403/org-hibernate-type-serializationexception-could-not-deserialize – StanislavL

相關問題