具有复合主键查询的 JPA COUNT 不起作用

Posted

技术标签:

【中文标题】具有复合主键查询的 JPA COUNT 不起作用【英文标题】:JPA COUNT with composite primary key query not working 【发布时间】:2014-03-11 02:49:00 【问题描述】:

在我的数据库中,我有一个表(默认值),当我从表中生成一个实体时,我得到了这两个类:

@Entity
public class Defaults implements Serializable 
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected DefaultsPK DefaultsPK;
    @Column(name = "ERTEK")
    private String ertek;

    getter/setter...


@Embeddable
public class DefaultsPK implements Serializable 
    @Basic(optional = false)
    @Column(name = "VALUE_1")
    private String value1;
    @Basic(optional = false)
    @Column(name = "TYPE")
    private String type;
    @Basic(optional = false)
    @Column(name = "VALID_FROM")
    @Temporal(TemporalType.TIMESTAMP)
    private Date validFrom;
    @Basic(optional = false)
    @Column(name = "VALID_TO")
    @Temporal(TemporalType.TIMESTAMP)
    private Date validTo;

    getter/setter...

这就是为什么主键包含值的原因。 我想统计表中的所有行,所以我使用了这段代码:

String sql = "SELECT COUNT(d) FROM Defaults d";
Query q = em.createQuery(sql);
long count = (long)q.getSingleResult();

但我收到此错误:

org.hibernate.exception.SQLGrammarException: could not execute query
...
java.sql.SQLSyntaxErrorException: ORA-00907: The right expression is missing from the arithmetic expression

有什么问题?与其他实体的其他计数查询正在运行。

我正在使用休眠。

【问题讨论】:

【参考方案1】:

使用count(d.ertek)count(d.id) 而不是count(d)。当您的实体具有复合主键时,可能会发生这种情况。

【讨论】:

是的,这是有效的:SELECT COUNT(d.DefaultsPK.value1) FROM Defaults d

以上是关于具有复合主键查询的 JPA COUNT 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥保留重复记录时h2复合主键不起作用?

JPA/Hibernate 和复合键

Spring Data JPA主键违规约束不起作用

JPA复合主键[重复]

SpringData JPA复合主键

jpa复合主键表不返回值