我想从 PostgreSQL 11.2 流式传输结果,而不是一次将所有结果读取到内存中。我使用最新的稳定版 SpringBoot 2.1.4.RELEASE。
我阅读了如何在 MySQL 中执行此操作的文章。 http://knes1.github.io/blog/2015/2015-10-19-streaming-mysql-results-using-java8-streams-and-spring-data.html 我还阅读了如何在 PostgreSQL 中执行此操作的文章: Postgresql 中的 Java 8 JPA 存储库流逐行
我有这样的存储库:
public interface ProductRepository extends JpaRepository<Product, UUID> {
@Query("SELECT p from Product p")
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "50"))
Stream<Product> streamAll();
}
Run Code Online (Sandbox Code Playgroud)
比我这样使用流:
productRepository.streamAll().forEach(product -> export(product));
Run Code Online (Sandbox Code Playgroud)
为了使示例更简单,'export' 方法完全为空。
当我调用该方法时,我看到 Hibernate 查询
Hibernate: select product0_.id as id1_0_, product0_.created as created2_0_, product0_.description as descript3_0_, product0_.name as name4_0_, product0_.product_type_id as product_5_0_ from products product0_ order by product0_.id
Run Code Online (Sandbox Code Playgroud)
一段时间后,我出现了 OutOfMemoryError。查询提示没有帮助。
如何使用 Spring Boot …
我有一个@Entity包含一些@OneToMany关系,但由于它们由 s 的集合组成Enum,所以我使用@ElementCollection. 该实体有一个在数据库级别 (MySQL) 生成的 ID。
这是我刚刚编写的一个小示例,它对应于我的实体的结构。
@Entity
public class Student {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ElementCollection(targetClass = Language.class)
@CollectionTable(name="student_languages", joinColumns=@JoinColumn(name="student_id"))
private Set<Language> languages;
@ElementCollection(targetClass = Module.class)
@CollectionTable(name="student_modules", joinColumns=@JoinColumn(name="student_id"))
private Set<Module> modules;
@ElementCollection(targetClass = SeatPreference.class)
@CollectionTable(name="student_seats", joinColumns=@JoinColumn(name="student_id"))
private Set<SeatPreference> seatPreference;
[...]
}
Run Code Online (Sandbox Code Playgroud)
我知道这GenerationType.IDENTITY会停用批处理,但我认为这仅适用于主要实体,而不适用于单个属性。我必须批量导入一些实体(~20k),每个实体都有一些属性,但是 Hibernate 似乎为集合中的每个属性生成一个插入,使得导入速度慢得难以置信(每个实体需要 10 到 20 个插入)记录)。
我现在花了很长时间试图加快速度,以至于我正在考虑生成一个可以手动导入数据库的 SQL 文件。
有没有办法指示Hibernate批量插入字段@ElementCollection?难道我做错了什么?
我想知道是否可以为 Spring 的CrudRepositorysave 方法定义自定义返回类型,就像下面的 find 查询方法示例一样:
<T> Optional<T> findById(Long id, Class<T> type);
Run Code Online (Sandbox Code Playgroud)
在文档中,我只找到了带有查询方法的动态投影的示例。
我试过
<T> T save(Foo entity, Class<T> type);
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Object com.xyz.myproject.persistence.dao.FooDAO.save(com.xyz.myproject.persistence.model.Foo,java.lang.Class)! No property save found for type Foo!
Run Code Online (Sandbox Code Playgroud)
有什么想法如何让它发挥作用吗?
这里/sf/answers/3707769131/ 很好地解释了为什么 @DataJpaTest @SpringBootTest 不应该混合在一个应用程序中。
但是几乎没有解释无论如何都需要测试 MVC SpringBoot 应用程序的每一层的情况(从我的角度来看,很自然地不仅要测试一层或仅测试另一层,而且甚至测试所有层,不是吗?)
所以有人建议使用 @AutoConfigureTestDatabase 而不是 @DataJpaTest 的解决方案,但没有完成工作(((
所以我的问题是:使用@AutoConfigureTestDatabase 是一个合适的解决方案吗?如果是,请详细说明。如果不是,请提出更合适的解决方案,谢谢
我有一个从多个表返回结果的存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetProjectAndClientOverview`()
BEGIN
SELECT ( SELECT count(*) FROM projects_info) as "projects_done",
(SELECT COUNT(*) FROM client_info) as "happy_clients",
(SELECT count(*) FROM projects_info where category_id in(
select id from pme.projects_category
where category_name in
("Commercial","Corporate","Hospitality")
)) as "real_professionals" ,
(SELECT COUNT(*) FROM client_info) as "cups_of_coffee";
END
Run Code Online (Sandbox Code Playgroud)
我必须使用 JPA 在 SpringBoot 中调用此过程,请指导如何为此存储过程创建实体类、存储库、服务。
我尝试创建实体类但不确定它是否正确
package com.panchmeru_studio.entities;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
@Data
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "getProjectAndClientOverview",
procedureName = "GetProjectAndClientOverview",
resultClasses ={ ProjectsInfo.class ,ClientInfo.class})
})
public class …Run Code Online (Sandbox Code Playgroud) jpa hibernate-mapping java-stored-procedures spring-boot-jpa
这些是我的 pom.xml 文件中添加的与 spring 相关的 jar
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我看到的错误是:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我尝试在 pom.xml 中更改 spring/jpa 等的不同版本,但问题仍然存在。