我正在通过注释配置在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(实例化了lazy collection)。
org.hibernate.pretty.Printer列出实体:...
测试{counter = 2,name = nom0.46579385535806883,firstName = prenom,nickNames =}
测试{counter = 0,name = nom0.6489676574372193,firstName = prenom,nickNames = [toto,surnom]}
测试{counter = 2,name = nom0.6362777689140984,firstName = prenom,nickNames =}
测试{counter = 2,name = nom0.15039481770844532,firstName = prenom,nickNames =}
测试{counter = 2,name = nom0.5580054662200352,firstName = prenom,nickNames =}
编辑:
因此,我知道这是当实例化惰性集合nickNames时,它返回0而不是好的数字。
所以这真的很烦人,因为我想获得大小以免使收藏变得虚假,但是如果我要求收藏的话,我必须掌握很好的信息...
有人知道怎么做吗?
谢谢,
最佳答案
查询应该看起来像(不应该有任何表关键字):
((Integer)session.createQuery(“从....中选择count(*)”。iterate()。next()).intValue();
来自休眠documentation