我想尝试一个简单的 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 的内容。
我希望有人能给我一些信息。
谢谢。
首先在存储库界面中将
<Category, Integer>
更改为<Category, Long>
,因为实体类的主键是Long
控制器中的第二个更改字段声明来自
private CategoryRepository categoryRepository
到
private final CategoryRepository categoryRepository
如果你想要构造函数注入
实体类中的最后一个
Category
还声明了一个不带任何参数的默认构造函数和一个包含所有参数的默认构造函数,它将对您有所帮助。您可以在这里找到一个很好的答案