我在 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;
在我的测试中,我只是想显示计数器编号(使用经典的 for )
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 listing entities:...
Test{counter=2, name=nom0.46579385535806883, firstName=prenom, nickNames=}
Test{counter=0, name=nom0.6489676574372193, firstName=prenom, nickNames=[toto, surnom]}
Test{counter=2, name=nom0.6362777689140984, firstName=prenom, nickNames=}
Test{counter=2, name=nom0.15039481770844532, firstName=prenom, nickNames=}
Test{counter=2, name=nom0.5580054662200352, firstName=prenom, nickNames=}
编辑: 所以我知道,当惰性集合 nickNames 被实例化时,它返回 0 而不是正确的数字。
所以这真的很烦人,因为我想获取大小以避免实例化集合,但如果我实例化了集合,我必须有一个好的信息......
有人知道如何做吗?
谢谢
最佳答案
查询应如下所示(不应有任何表关键字):
( (Integer) session.createQuery("从...中选择 count(*)").iterate().next() ).intValue();
来自 hibernate documentation
关于java - hibernate/JPA 的自定义选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4783211/