我使用JPA而不是Hibernate,帶有註釋配置。自定義選擇休眠/ JPA
我正在尋找做一個自定義的「選擇」,這將讓我知道「懶集」的大小,而無需獲得集合。
我試過了,沒有成功:
@Entity
@Table(name="t_test")
public class Test {
@Id
@Column(name="name", length=50)
private String name;
@Column(name="first_name", length=50)
private String firstName;
@ElementCollection(fetch=FetchType.LAZY)
@JoinTable(name = "tj_test_nicknames", schema="",
joinColumns = {@JoinColumn(name = "name")}
)
@ForeignKey(name = "FK_test_nickname")
@Column(name="nickname", nullable=false)
private Set<String> nickNames = new HashSet();
@Formula("(SELECT COUNT(t.nickname) FROM tj_test_nicknames t WHERE t.name = name)")
private int counter;
在我的測試,我只是想顯示計數器號(與經典)
Test test = new Test();
test.setFirstName("prenom");
test.setName("nom" + Math.random());
Set<String> nickNames = new HashSet<String>();
nickNames.add("surnom");
nickNames.add("toto");
test.setNickNames(nickNames);
testDAO.save(test);
Collection<Test> tests = testDAO.getAll();
if(tests!=null){
for (Test testT : tests) {
logger.info("Number of nicknames: " + testT.getNumberOfNicknames());
logger.info("Size of the list:: " + testT.getNickNames().size());
}
}
但我爲顯示0每個對象實例(具有實例懶惰集合)。
org.hibernate.pretty.Printer上市實體:...
測試{計數器= 2,名稱= nom0.46579385535806883,名字= prenom,暱稱=}
測試{計數器= 0,姓名= nom0.6489676574372193,名字= prenom,暱稱= [TOTO,surnom]}
測試{計數器= 2,名稱= nom0.6362777689140984,名字= prenom,暱稱=}
測試{計數器= 2,name = nom0.150394817708445 32,名字= prenom,暱稱=}
測試{計數器= 2,名稱= nom0.5580054662200352,名字= prenom,暱稱=}
編輯: 所以我理解,這就是當延遲收集nickNames會立即返回0而不是好數字。
所以它真的很煩人,因爲我想爲了不intanciate集合的大小,但在情況下,我有收集實例化我必須有一個良好的信息...
人有一個想法怎麼做 ?
感謝,
請顯示更多Java,「沒有成功」的意思也是有幫助的。 – Osw 2011-01-24 15:04:25
如果您運行查詢(從t_test test0_開始,將test0_.name作爲name0_,test0_.first_name作爲first2_0_,(SELECT COUNT(t.nickname)FROM tj_test_nicknames t WHERE t.name = test0_.name)直接在數據庫上? – Ralph 2011-01-28 21:59:53
它顯示所有數據,我有很好的公式計數。樣品:nom0.15039481770844532 \t prenom nom0.46579385535806883 \t prenom .. – RoD 2011-01-31 09:02:40