java - hibernate/JPA 的自定义选择

标签 java sql hibernate 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;

在我的测试中,我只是想显示计数器编号(使用经典的 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/

相关文章:

java - 在 DispatcherServlet 中未找到带有 URI 的 HTTP 请求的映射 - 上下文组件扫描不起作用

java - 安卓工作室错误 : app:mergeDebugResources

java - Mybatis RowBounds 与 resultMap 内的集合不返回预期结果

java - 在我的 Java 游戏项目中过度使用静态?

php - 使用 WHERE 子句检查一个 SQL 查询中的数组中的值

java - Hibernate 映射有时会停止工作

java - Java 中的异步执行流程

sql - 将查询转换为存储过程

sql - PostgreSQL 行安全策略不适用于 CREATE POLICY FOR UPDATE WITH CHECK (false);

sql - 在 Hibernate SQL 查询中你如何转义?字段名称中的字符