我正在使用
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才能使其工作?或者我的实体有什么问题吗?
作为 Id 类的类需要有一个无参数构造函数。您收到的错误表明无法找到 WordId 类的无参数构造函数。
向 WordId 类添加无参数构造函数应该可以解决您当前的问题。