JPA 在具有 where 条件的列中获得最高值

问题描述 投票:0回答:1

我正在使用

JpaRepository
访问数据库中的表。我通过一个实体定义了该表。我的目标是获得
wordNumber
列中的最高值。但我还必须通过
languageId
列来区分条目。这意味着我的存储库中需要一个方法,该方法接收一个参数,我可以在查询中使用该参数。

目前我的存储库方法如下所示:

public interface WordRepository extends JpaRepository<Word, Word.WordId>
{
    @Query(value = "SELECT MAX(wordNumber) FROM Word WHERE languageId = :languageId")
    Optional<Long> getHighestId(@Param("languageId") Long languageId);
}

实体看起来像这样:

@Data
@Entity
@IdClass(Word.WordId.class)
@Table(name = "WORD")
public class Word
{
    @Id
    private Long languageId;
    @Id
    private Long wordNumber;

    private String letters;

    @AllArgsConstructor
    public class WordId implements Serializable
    {
        public Long languageId;
        public Long wordNumber;

        @Override
        public boolean equals(Object o)
        {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            WordId wordId = (WordId) o;
            return Objects.equals(languageId, wordId.languageId) && Objects.equals(wordNumber, wordId.wordNumber);
        }

        @Override
        public int hashCode()
        {
            return Objects.hash(languageId, wordNumber);
        }
    }
}

当我使用

languageId=0
调用存储库中的方法并将 hibernate-sql-logging 设置为跟踪时,生成的 sql 是:

 select max(w1_0.word_number) from word w1_0 where w1_0.language_id=?

并且立即抛出此错误:

org.hibernate.InstantiationException: Unable to locate constructor for embeddable 'io.fi0x.languagegenerator.db.entities.Word$WordId'

我该如何调整sql才能使其工作?或者我的实体有什么问题吗?

java hibernate jpa spring-data-jpa
1个回答
0
投票

作为 Id 类的类需要有一个无参数构造函数。您收到的错误表明无法找到 WordId 类的无参数构造函数。

向 WordId 类添加无参数构造函数应该可以解决您当前的问题。

© www.soinside.com 2019 - 2024. All rights reserved.