2011-01-24 96 views
0

我使用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集合的大小,但在情況下,我有收集實例化我必須有一個良好的信息...

人有一個想法怎麼做 ?

感謝,

+0

請顯示更多Java,「沒有成功」的意思也是有幫助的。 – Osw 2011-01-24 15:04:25

+0

如果您運行查詢(從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

+0

它顯示所有數據,我有很好的公式計數。樣品:nom0.15039481770844532 \t prenom nom0.46579385535806883 \t prenom .. – RoD 2011-01-31 09:02:40

回答

1

查詢應該像(不應該有任何表的關鍵字):

((整數)session.createQuery( 「從SELECT COUNT(*)......」) .iterate()。next()).intValue();

它從休眠documentation

0

反正你的查詢看起來有點奇怪:我excpect該ID是你的主鍵,這樣算其中id = XYZ僅前人的精力返回0或1 - 也許問題是您查詢。