Spring数据JPA JDBC语句疯狂
我有一个简单的实体:Spring数据JPA JDBC语句疯狂,spring,jpa,spring-boot,kotlin,spring-data-jpa,Spring,Jpa,Spring Boot,Kotlin,Spring Data Jpa,我有一个简单的实体: @Entity @Table(name = "dish_type") class DishType : Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = -1 var name: String? = null var description: String? = null @OneToMany(mapped
@Entity
@Table(name = "dish_type")
class DishType : Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = -1
var name: String? = null
var description: String? = null
@OneToMany(mappedBy = "dishType")
var dishTypeLocales: List<DishTypeLocale>? = null
}
@Entity
@Table(name = "dish_type_locale")
class DishTypeLocale : Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = -1
@Enumerated(EnumType.STRING)
var locale: LocaleString? = null
var value: String? = null
@ManyToOne
@JoinColumn(name = "dish_type_id")
var dishType: DishType? = null
}
如果是DishTypeService.findAll(true)
statements==table.size(在我的例子中是282):
如何告诉Spring在1中获取所有数据(ok mb 2-3语句)
DB:postgresql9.6您正在经历延迟加载关系,这是
OneToMany
关系的默认行为
这里有4个选项:
fetchjoin
加载实体和关系。为此,您必须使用以下查询(草稿)在存储库中编写一个自定义方法:从DishType dt JOIN FETCH dt.dishTypeLocales中选择dt
您正在经历延迟加载关系,这是
OneToMany
关系的默认行为
这里有4个选项:
fetchjoin
加载实体和关系。为此,您必须使用以下查询(草稿)在存储库中编写一个自定义方法:从DishType dt JOIN FETCH dt.dishTypeLocales中选择dt
这是最小工作示例吗?这是最小工作示例吗?
interface DishTypeService {
fun findAll(withLocale: Boolean): List<DishTypeDto>
}
@Service
@Transactional
open class DishTypeServiceImpl(private val dishTypeRepository: DishTypeRepository) : DishTypeService {
override fun findAll(withLocale: Boolean): List<DishTypeDto> {
return this.dishTypeRepository.findAll().map { DishTypeDto(it, withLocale) }
}
}
@Repository
interface DishTypeRepository : JpaRepository<DishType, Long>
class DishTypeDto {
var id: Long = -1
var description: String? = null
var locale: List<DefaultLocalizationDto>? = null
constructor()
constructor(dishType: DishType, withLocale: Boolean) {
this.id = dishType.id
this.description = dishType.description
if (withLocale) {
this.locale = dishType.dishTypeLocales?.map { DefaultLocalizationDto(it) }
}
}
override fun toString(): String {
return "DishTypeDto{" +
"id=" + id +
", description='" + description + '\'' +
'}'
}
}
class DefaultLocalizationDto {
var locale: Int? = null
var name: String? = null
var description: String? = null
constructor()
constructor(locale: DishTypeLocale) {
this.locale = locale.locale?.code
this.name = locale.value
}
override fun toString(): String = "DefaultLocalizationDto(locale=$locale, name=$name, description=$description)"
}
Session Metrics {
6789040 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
146499 nanoseconds spent preparing 1 JDBC statements;
3929488 nanoseconds spent executing 1 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
43774 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)
}
Session Metrics {
11570010 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
4531164 nanoseconds spent preparing 282 JDBC statements;
60280410 nanoseconds spent executing 282 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
60464 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)
}
@OneToMany(mappedBy = "dishType", fetch = FetchType.EAGER)
var dishTypeLocales: List<DishTypeLocale>? = null
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>