使用SpringBoot JPA从MariaDB读取数据

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

我想尝试一个简单的 Spring Boot Hibernate 示例。

我有这个数据库:

create or replace table treasurelog.categories
(
    id   bigint auto_increment
        primary key,
    name varchar(20) null
);

我想使用 JPA Hibernate 从中获取数据。 访问是通过 CategoryController 和 JPARepository 进行的。

如上所示,我的DB中的Table Category,只有ID为PK和名称。

然后我写了这个控制器:

@RestController
public class FindingController {
    private CategoryRepository categoryRepository;

    public FindingController(CategoryRepository categoryRepository) {
        this.categoryRepository = categoryRepository;
    }

    @GetMapping(value = "/categories")
    public List<Category> getCategories() {
        return categoryRepository.findAll();
    }
}

使用此存储库

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface CategoryRepository extends JpaRepository<Category, Integer> {

    @Query("select Category as category from Category ")
    public List<Category> findAll();
}

这个实体:

@Getter
@Setter
@Entity
@Table(name = "categories")
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Size(max = 20)
    @Column(name = "name", length = 20)
    private String name;

}

但是我在尝试 GET 时总是遇到此错误:

ava.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.DiscriminatorType.getJdbcJavaType()" because "this.discriminatorType" is null
    at org.hibernate.sql.ast.tree.expression.EntityTypeLiteral.createSqlSelection(EntityTypeLiteral.java:132) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.sql.ast.tree.expression.EntityTypeLiteral.createDomainResult(EntityTypeLiteral.java:123) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$visitSelection$23(BaseSqmToSqlAstConverter.java:2287) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at java.base/java.util.Collections$SingletonList.forEach(Collections.java:4966) ~[na:na]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelection(BaseSqmToSqlAstConverter.java:2282) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectClause(BaseSqmToSqlAstConverter.java:2200) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:2044) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:434) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.tree.select.SqmQuerySpec.accept(SqmQuerySpec.java:125) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.spi.BaseSemanticQueryWalker.visitQueryPart(BaseSemanticQueryWalker.java:221) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQueryPart(BaseSqmToSqlAstConverter.java:1902) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:1587) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:434) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.tree.select.SqmSelectStatement.accept(SqmSelectStatement.java:222) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.translate(BaseSqmToSqlAstConverter.java:770) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.buildCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:345) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:268) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:244) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:518) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.hibernate.query.Query.getResultList(Query.java:119) ~[hibernate-core-6.2.7.Final.jar:6.2.7.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:129) ~[spring-data-jpa-3.1.3.jar:3.1.3]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:92) ~[spring-data-jpa-3.1.3.jar:3.1.3]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:148) ~[spring-data-jpa-3.1.3.jar:3.1.3]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:136) ~[spring-data-jpa-3.1.3.jar:3.1.3]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:136) ~[spring-data-commons-3.1.3.jar:3.1.3]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:120) ~[spring-data-commons-3.1.3.jar:3.1.3]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164) ~[spring-data-commons-3.1.3.jar:3.1.3]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) ~[spring-data-commons-3.1.3.jar:3.1.3]

在我看到的教程中没有任何关于 DecriminatorType 的内容。

我希望有人能给我一些信息。

谢谢。

spring hibernate jpa entity boot
1个回答
0
投票

首先在存储库界面中将

<Category, Integer>
更改为
<Category, Long>
,因为实体类的主键是
Long

控制器中的第二个更改字段声明来自

private CategoryRepository categoryRepository 

private final CategoryRepository categoryRepository

如果你想要构造函数注入

实体类中的最后一个

Category
还声明了一个不带任何参数的默认构造函数和一个包含所有参数的默认构造函数,它将对您有所帮助。您可以在这里找到一个很好的答案

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