I'm working on presentation in which I would like to show difference in number of executed sql queries between deleteByPost()
method with and without custom query.
(我正在研究演示文稿,其中我想显示带和不带自定义查询的deleteByPost()
方法之间执行的SQL查询数量的差异。)
I'm expecting method without custom query to execute 10001 delete queries and with it just 2. (我期望没有自定义查询的方法执行10001个删除查询,并且仅执行2个。)
I'm aware of Hibernate Statistics object and it's methods.
(我知道Hibernate Statistics对象及其方法。)
I was expecting one of them, named getQueryExecutionCount()
, to return the number of sql queries executed against db, but what I'm getting is always a 0. (我期望其中一个名为getQueryExecutionCount()
返回对db执行的sql查询的数量,但是我得到的始终是0。)
If anyone wonders hibernate statistics are enabled for sure because I'm getting correct numbers on other properties like the count of deleted entities.
(如果有人想知道肯定启用了休眠统计信息,因为我在其他属性(例如已删除实体的数量)上获得了正确的数字。)
Below there is a complete example showing what I am trying to accomplish.
(下面有一个完整的示例,显示了我要完成的工作。)
Is there a way to get the number of generated and executed queries using Statistics
or any other mechanism?
(有没有一种方法可以使用Statistics
或任何其他机制来获取已生成和已执行查询的数量?)
Currently I'm looking at logs ( hibernate.show_sql
) and counting printed queries but it just seems wrong to me. (目前,我正在查看日志( hibernate.show_sql
)并计算打印查询的数量,但这对我来说似乎是错误的。)
package example5
import org.hibernate.SessionFactory
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertAll
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.data.jpa.repository.Modifying
import org.springframework.data.jpa.repository.Query
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.repository.query.Param
import org.springframework.stereotype.Repository
import org.springframework.stereotype.Service
import org.springframework.test.context.junit.jupiter.SpringJUnitJupiterConfig
import org.springframework.transaction.annotation.EnableTransactionManagement
import org.springframework.transaction.annotation.Transactional
import javax.persistence.*
// ENTITIES
@Entity
@Table(name = "posts")
class Post(
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var id: Long? = null,
@Version
@Column(name = "version")
var version: Long? = null
)
@Entity
@Table(name = "comments")
class Comment(
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var id: Long? = null,
@Version
@Column(name = "version")
var version: Long? = null,
@JoinColumn(name = "post_id")
@ManyToOne(fetch = FetchType.LAZY)
var post: Post? = null
)
// REPOSITORIES
@Repository
interface PostRepository : PagingAndSortingRepository<Post, Long>
@Repository
interface CommentRepository : PagingAndSortingRepository<Comment, Long> {
@Modifying
@Query("delete from Comment c where c.post = :post")
fun deleteByPost(@Param("post") post: Post)
}
// SERVICES
interface PostService {
fun delete(post: Post)
}
@Service
open class PostServiceImpl(
@Autowired
val postRepository: PostRepository,
@Autowired
val commentRepository: CommentRepository
) : PostService {
@Transactional
override fun delete(post: Post) {
commentRepository.deleteByPost(post)
postRepository.delete(post)
}
}
// CONFIGURATION
@EnableJpaRepositories(basePackages = ["example5"])
@EnableTransactionManagement
@SpringBootApplication(scanBasePackages = ["example5"])
open class FrameworkApplication
// TESTS
@SpringJUnitJupiterConfig(classes = [FrameworkApplication::class])
class Example5(
@Autowired
val postService: PostService,
@Autowired
val postRepository: PostRepository,
@Autowired
val commentRepository: CommentRepository,
@Autowired
val emFactory: EntityManagerFactory
) {
@AfterEach
fun cleanUp() {
commentRepository.deleteAll()
postRepository.deleteAll()
}
@Test
fun testDelete() {
//given
var post = Post()
post = postRepository.save(post)
val comments = mutableListOf<Comment>()
for (i in 1..10000) {
val comment = Comment()
comment.post = post
comments.add(comment)
}
commentRepository.save(comments)
val sessionFactory = emFactory.unwrap(SessionFactory::class.java)
val statistics = sessionFactory.statistics
//then
statistics.clear()
postService.delete(post)
val executedQueryCount = statistics.queryExecutionCount
//then
assertAll(
{ assertEquals(0, postRepository.count()) },
{ assertEquals(0, commentRepository.count()) },
{ assertEquals(2, executedQueryCount) }
)
}
}
ask by Dcortez translate from so 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…