近期在做一个双数据源同步的需求,项目主要采用springboot,通过JPA操作数据库,由于好久没玩hibernate了,凭借模糊的记忆加上Google大法,总算是有了一个大体上的熟系,现将开发过程中遇到的问题总结记录一下,弥补自己脑内存不足的问题,也希望对大家有所帮助。

1. 如果有条件尽量不要使用字符串

在拼接查询语句时,经常需要使用到表的列明,如代码中的missionId,建议常量化,方便代码调整改动,

Specification<MissionRuleRelation> specification = new Specification<>() {@Overridepublic Predicate toPredicate(Root<MissionRuleRelation> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {return criteriaBuilder.equal(root.get("missionId"), mission.getId());}
};

也可以引入hibernate的后处理器,会自动生成字段名的字符串常量

annotationProcessor('org.hibernate:hibernate-jpamodelgen:5.4.31.Final')

2. postgresql的建表语句

在项目中的建表语句,发现都有加上限定名,导致每次改表名的时候都忘记改相应的限定名,导致sql执行失败。其实默认情况下postgresql会自动生成相应格式的限定名。默认格式为"表名 _ 字段名 _ 约束简写",如“demo_name_key”
比如下面的唯一约束名‘demo_name_unique’

CREATE TABLE demo (id UUID PRIMARY KEY NOT NULL DEFAULT uuid_generate_v4(),"name" varchar(100) NOT NULL,CONSTRAINT demo_name_unique UNIQUE (name)
);

3. 全局跑测试无法查看日志

当测试失败时,借助**–info**及管道重定向方式,输出到日志文件方便查看及问题定位分析

./gradlew clean test --info > 1.log

4. 注意代理类

4.1. 定时任务

本项目采用的是SchedulerLock对分布式定时任务进行管控,在编写测试用例时直接调用了scheduleSyncData()方法,比如下面的代码就只能在10s内调用一次,从而导致有关的业务数据不是你希望的。所以最好不要直接测试scheduleSyncData()方法,可以测试doSyncData()。

@Scheduled(cron = "${sync-data:*/5 * * * * *}")
@SchedulerLock(name = "syncData", lockAtMostFor = "1h", lockAtLeastFor = "10s")
public void scheduleSyncData(){doSyncData();
}

从日志也可以看出,SchedulerLock执行前进行了判断

    2021-08-18 19:08:32.604 ERROR 48216 --- [    Test worker] .d.r.OpsRewardConfigTablesRepositoryTest : sync>>>>before2021-08-18 19:08:32.604 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.jdbc.datasource.ConnectionHolder@5a099e19] for key [HikariDataSource (HikariPool-3)] to thread [Test worker]2021-08-18 19:08:32.604 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Initializing transaction synchronization2021-08-18 19:08:32.604 DEBUG 48216 --- [    Test worker] o.s.jdbc.core.JdbcTemplate               : Executing prepared SQL update2021-08-18 19:08:32.604 DEBUG 48216 --- [    Test worker] o.s.jdbc.core.JdbcTemplate               : Executing prepared SQL statement [UPDATE shedlock SET lock_until = ?, locked_at = ?, locked_by = ? WHERE name = ? AND lock_until <= ?]2021-08-18 19:08:32.604 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@5a099e19] for key [HikariDataSource (HikariPool-3)] bound to thread [Test worker]2021-08-18 19:08:32.604 TRACE 48216 --- [    Test worker] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 1, parameter value [java.util.GregorianCalendar[time=1629288512604,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=7,WEEK_OF_YEAR=34,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=230,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=8,SECOND=32,MILLISECOND=604,ZONE_OFFSET=28800000,DST_OFFSET=0]], value class [java.util.GregorianCalendar], SQL type unknown2021-08-18 19:08:32.604 TRACE 48216 --- [    Test worker] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 2, parameter value [java.util.GregorianCalendar[time=1629284912604,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=7,WEEK_OF_YEAR=34,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=230,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=8,SECOND=32,MILLISECOND=604,ZONE_OFFSET=28800000,DST_OFFSET=0]], value class [java.util.GregorianCalendar], SQL type unknown2021-08-18 19:08:32.605 TRACE 48216 --- [    Test worker] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 3, parameter value [CNMAC0242.local], value class [java.lang.String], SQL type unknown2021-08-18 19:08:32.605 TRACE 48216 --- [    Test worker] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 4, parameter value [com.crypto.reward.ops.db.schedule.sync.SyncDataWorker.syncData], value class [java.lang.String], SQL type unknown2021-08-18 19:08:32.605 TRACE 48216 --- [    Test worker] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 5, parameter value [java.util.GregorianCalendar[time=1629284912604,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=7,WEEK_OF_YEAR=34,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=230,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=8,SECOND=32,MILLISECOND=604,ZONE_OFFSET=28800000,DST_OFFSET=0]], value class [java.util.GregorianCalendar], SQL type unknown2021-08-18 19:08:32.605 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@5a099e19] for key [HikariDataSource (HikariPool-3)] bound to thread [Test worker]2021-08-18 19:08:32.607 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@5a099e19] for key [HikariDataSource (HikariPool-3)] bound to thread [Test worker]2021-08-18 19:08:32.608 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization2021-08-18 19:08:32.608 TRACE 48216 --- [    Test worker] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder@5a099e19] for key [HikariDataSource (HikariPool-3)] from thread [Test worker]2021-08-18 19:08:32.608 ERROR 48216 --- [    Test worker] .d.r.OpsRewardConfigTablesRepositoryTest : sync>>>>after

4.2. 声明式事物

这个大家应该都懂的,同一个类中的声明式事物最好不要相互调用,因为自调用是不走代理类的。所以要调用就要自己强行走代理了。

@Transactional(rollbackFor = Throwable.class)
public void sync(F from) {((AbstrackSyncWorker)AopContext.currentProxy()).doSync(from);fromRepository.updateSyncedToTrueById(from.getId());
}@Transactional(propagation = Propagation.REQUIRES_NEW, transactionManager = "rewardTransactionManager", rollbackFor = Throwable.class)
public void doSync(F from) {//
}

当然别忘记打开暴露代理的配置

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)

5. jpa相关

5.1. 实体的继承

如果出现实体的继承,需要在父类上添加**@Inheritance**(strategy = InheritanceType.TABLE_PER_CLASS)(表的策略依实际情况设定),否则不会有父类的字段

5.2. 实体的映射关系

  • 当存在例如@ManyToOne等关联关系时,lombok的@Data要注意tostring/hashcode造成死循环,可以借助如下两个注解进行排除
@EqualsAndHashCode.Exclude
@ToString.Exclude
  • lombok对于继承关系的tostring/hashcode/builder默认是不管父类的字段,如果需要调用父类的情况需要添加如下注解
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@SuperBuilder

5.3. 实体操作

  • hibernate使用@Version用于乐观锁,不能直接修改,出现以下异常,由于乐观锁version没有对上,导致操作数据库失败。
Object of class [com.fan.reward.db.domain.app.App] with identifier [c35ed988-37e3-4ec1-b33b-c804fcbe073a]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.fan.reward.db.domain.app.App#c35ed988-37e3-4ec1-b33b-c804fcbe073a]
org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [com.fan.reward.db.domain.app.App] with identifier [c35ed988-37e3-4ec1-b33b-c804fcbe073a]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.fan.reward.db.domain.app.App#c35ed988-37e3-4ec1-b33b-c804fcbe073a]at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:315)at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233)at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551)at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)at com.sun.proxy.$Proxy130.save(Unknown Source)at com.fan.reward.ops.db.repository.OpsRewardConfigTablesRepositoryTest.saveApp(OpsRewardConfigTablesRepositoryTest.java:165)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)at com.sun.proxy.$Proxy5.stop(Unknown Source)at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)at java.base/java.lang.Thread.run(Thread.java:834)
  • JpaRepository.saveAndFlush只是会执行相应的sql不会提交事物,所以并不会对当前entitymanager管理的entity体现例如@Version变化

  • JpaRepository.delete的删除不会立即执行,如果业务需要先删除后插入,则会异常,需要调用flush或者在delete方法上自己添加@Query(sql)

  • @Id的字段如果指定了@GeneratedValue会忽略手动赋值

6. error prone代码检查

error prone 对于标注了@Slf4j注解的,但从未使用过log的情况,会报类似IndexOutOfBoundsException的错,并不会具体指名哪里未使用过,所以报错了也很坑,完全不知道怎么就异常了。

package com.fan.reward.ops.db.repository;
^Please report this at https://github.com/google/error-prone/issues/new and include the following:error-prone version: 2.3.4BugPattern: UnusedVariableStack Trace:java.lang.IndexOutOfBoundsExceptionat java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:633)at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:41)at com.google.errorprone.VisitorState.getOffsetTokens(VisitorState.java:578)at com.google.errorprone.fixes.SuggestedFixes.replaceIncludingComments(SuggestedFixes.java:1238)at com.google.errorprone.bugpatterns.UnusedVariable.buildUnusedVarFixes(UnusedVariable.java:384)at com.google.errorprone.bugpatterns.UnusedVariable.matchCompilationUnit(UnusedVariable.java:236)at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:451)at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:557)at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:152)at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:591)at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)at com.google.errorprone.scanner.Scanner.scan(Scanner.java:56)at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:152)at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1418)at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1365)at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:960)at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:74)at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:94)at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:55)at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:40)at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:97)at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:46)at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:36)at org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler.execute(SelectiveCompiler.java:82)at org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler.execute(SelectiveCompiler.java:37)at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:61)at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:45)at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:59)at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:51)at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler.execute(CompileJavaBuildOperationReportingCompiler.java:51)at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:345)at org.gradle.api.tasks.compile.JavaCompile.performIncrementalCompilation(JavaCompile.java:239)at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:211)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:494)at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:479)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:462)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$400(ExecuteActionsTaskExecuter.java:105)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:273)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:251)at org.gradle.internal.execution.steps.ExecuteStep.lambda$executeOperation$0(ExecuteStep.java:65)at java.base/java.util.Optional.map(Optional.java:265)at org.gradle.internal.execution.steps.ExecuteStep.executeOperation(ExecuteStep.java:65)at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:34)at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:44)at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:34)at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:72)at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:42)at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:53)at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:44)at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:77)at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:58)at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:54)at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:32)at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:57)at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:38)at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:63)at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:30)at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:176)at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:76)at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:47)at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:43)at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:32)at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:39)at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:25)at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:102)at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:95)at java.base/java.util.Optional.map(Optional.java:265)at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:83)at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:96)at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:52)at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:83)at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:54)at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:88)at java.base/java.util.Optional.orElseGet(Optional.java:369)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:88)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:46)at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:34)at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:43)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$3.withWorkspace(ExecuteActionsTaskExecuter.java:286)at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:43)at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:33)at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:40)at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:30)at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:54)at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:40)at org.gradle.internal.execution.impl.DefaultExecutionEngine.execute(DefaultExecutionEngine.java:41)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:183)at java.base/java.util.Optional.orElseGet(Optional.java:369)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:183)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:173)at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:411)at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:398)at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:391)at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:377)at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)at java.base/java.lang.Thread.run(Thread.java:834)

7. idea工具莫名其妙

对于maven项目,平常本地都是直接运行main方法,但是对于gradle的项目可能会采用**./gradlew app:bootRun**方式运行,目前项目采用的就是gradle管理的,在使用@Lazy时就出现了空指针的情况。

// 1方式,两种方式都可以正常启动
// 2方式,main方法执行时,会在MeterRegistrygetMappedId()时,报filters的空指针异常
@Lazy // 1
@Bean
public MetricsRepositoryMethodInvocationListener metricsRepositoryMethodInvocationListener(
MetricsProperties metricsProperties, /**@Lazy 2*/MeterRegistry registry, RepositoryTagsProvider tagsProvider) {var properties = metricsProperties.getData().getRepository();return new MetricsRepositoryMethodInvocationListener(registry, tagsProvider, properties.getMetricName(), properties.getAutotime());
}

8.关于native query

8.1. uuid类型的映射
@Query(value = "select app.id as appId from app_source app ", nativeQuery = true)
List<IUu> findAppWithTrack();

调用此方法会报如下错误

2021-09-01 09:37:01.258 DEBUG 35274 --- [    Test worker] org.hibernate.SQL                        : selectapp.id as appId fromapp_source app No Dialect mapping for JDBC type: 1111; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
org.springframework.orm.jpa.JpaSystemException: No Dialect mapping for JDBC type: 1111; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:331)at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233)at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551)at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)at com.sun.proxy.$Proxy137.findAppWithTrack(Unknown Source)at com.crypto.reward.ops.db.repository.RewardRepositoryTest.test(RewardRepositoryTest.java:60)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)at com.sun.proxy.$Proxy5.stop(Unknown Source)at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111at org.hibernate.dialect.TypeNames.get(TypeNames.java:71)at org.hibernate.dialect.TypeNames.get(TypeNames.java:103)at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:740)at org.hibernate.loader.custom.JdbcResultMetadata.getHibernateType(JdbcResultMetadata.java:100)at org.hibernate.loader.custom.ScalarResultColumnProcessor.performDiscovery(ScalarResultColumnProcessor.java:45)at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:494)at org.hibernate.loader.Loader.preprocessResultSet(Loader.java:2349)at org.hibernate.loader.Loader.getResultSet(Loader.java:2305)at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2056)at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2018)at org.hibernate.loader.Loader.doQuery(Loader.java:948)at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)at org.hibernate.loader.Loader.doList(Loader.java:2849)at org.hibernate.loader.Loader.doList(Loader.java:2831)at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2663)at org.hibernate.loader.Loader.list(Loader.java:2658)at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338)at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2141)at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1169)at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:176)at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1604)at org.hibernate.query.Query.getResultList(Query.java:165)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:406)at com.sun.proxy.$Proxy158.getResultList(Unknown Source)at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:126)at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155)at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143)at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159)at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)... 98 more

主要原因是hibernate提供的PostgreSQL相关Dialect并未注册相应的数据类型,即有从java到RDB的映射registerColumnType( Types.OTHER, “uuid” );,但并没有类似的从RDB到java的映射registerHibernateType( Types.OTHER, StandardBasicTypes.UUID_CHAR.getName() );,所以解决办法有两种

  • 提供扩展的Dialect
public class MyDialect extends PostgreSQL10Dialect {public MyDialect() {super();registerHibernateType( Types.OTHER, StandardBasicTypes.UUID_CHAR.getName() );}
}
  • 类型转换
@Query(value = "select cast(app.id as varchar ) as appId from app_source app where app.name is null", nativeQuery = true)
List<IUu> findAppWithTrack();

使用SpEL转换或用其他方式转

public interface IUu {@Value("#{target.userId != null? T(java.util.UUID).fromString(target.userId) :null}")UUID getAppId();
}

自我复盘-20210820相关推荐

  1. 提升自我的最佳方法:复盘

    前言:复盘,是一个人或者是一个公司成长最快且最重要的方法,如果没有复盘的意识,那么你可能一直在原地踏步,甚至还自我感觉良好,这是个人成长最致命的错误.  在生活中,你可能会看到两种人,一种隔了段时间没 ...

  2. 一个测试工程师的成长复盘

    背景 前几天微信群有个同学加我好友,向我咨询一些问题.他说,看到我在群里说了一段话: 成年人,最重要的是获取知识的方式和思维逻辑,而不是只追求知识量的增加,提升增量,而不是存量. 学习,永远是学习能快 ...

  3. 深度复盘:用半年时间操盘一家出海创业公司

    半年前有一个很不错的职业机会找到了我,是希望我在杭州组建一家公司做出海业务.但与对方几番沟通下来,最终我给到的回复是:时机不成熟. 但真实的原因是:我怂了. 因为打一份工和做一家公司还真的是两个概念, ...

  4. 20天拿到美团快手小米搜狐跟谁学offer

    最近看了看外面的机会,特此汇总下,希望对读者有帮助. 战况 贝壳:一轮技术面,自挂东南枝. 脉脉:两轮技术面,自挂东南枝. 跟谁学:三轮技术面 + 一轮 HR 面. 搜狐:三轮技术面 + 一轮 HR ...

  5. 外包程序员是如何花 5 年时间从月薪 4 千到年薪近百万?

    ‍‍ ‍‍ 作者 | 程军 来源 | 军哥手记(ID:zxhy_cj) 端午节前,我在朋友圈征集程序员或产品的真实励志故事,有一位读者张鹏(化名)给我详述了他从 2016 年入行以来的经历,他是如何从 ...

  6. 范凯:一个二次创业者的失败

    本文根据范凯在2016ArchSummit全球架构师(深圳)峰会上的演讲整理而成. \\ ArchSummit北京站即将在12月2日开幕,更多专题讲师信息请到北京站官网查询. \\ 先自我介绍一下,我 ...

  7. Redis实战之限制操作频率

    2019独角兽企业重金招聘Python工程师标准>>> 最近沉迷于业务开发无法自拔 ?,有一段时间没有更新博文了,后续博文内容计划把一些业务场景下的实战方案,或者比较好的设计思路进行 ...

  8. 印象笔记电脑版使用技巧_我的印象笔记使用手册(2020)

    2018年1月我开始使用印象笔记,使用700余天,留下1866条笔记,印象笔记已成为我生活的一部分. 今天我会从多个角度来剖析我的印象笔记使用技巧. 文章有点长,但请相信,保证阳阳精选. 01 为什么 ...

  9. 【产品经理求职攻略】10年产品人经验分享

    关于我:鹅厂10年产品,5年产品及团队管理经验.专注个人成长.职业发展.产品经理领域. 作为互联网产品经理工作10年,接触过的求职者不能说有1000+,也得有500+,虽然环境在变,行业在变,人才在变 ...

最新文章

  1. Oracle 高性能SQL引擎剖析----执行计划
  2. 云炬随笔20180613
  3. 树形结构:使用栈实现,快排,先序遍历,归并排序,后序遍历
  4. php中如何定义常量和变量的区别,php define常量定义与变量区别
  5. c++面向对象高级编程 学习十五 组合继承关系下的构造和析构
  6. java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...
  7. linux常用翻页,20150823-Linux常用命令
  8. “大鳄”伪装小职员,涉案金额达 5 亿!全球最大游戏外挂案告破
  9. cocos2d-x中的尺寸之一
  10. 数据结构上机实践第八周项目5 - 计数的模式匹配
  11. 一步一步重构柔性数组和智能指针
  12. gitee怎么看用户名_怎么优雅的写博客 Typora + picGo
  13. 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (6)
  14. 网络流专题(最大流与费用流)例题总结
  15. 单片机c语言 一小时,1小时单片机C语言入门..doc
  16. 关于圆锥曲线切点弦二级结论的总结与再发现
  17. 各平均数介绍(算数平均数、几何平均数、加权算术平均数)
  18. 整合ecshop与discuz论坛
  19. 在我眼中的生活的苦难
  20. 基于VC++的MFC类库实现的简单FTP客户端

热门文章

  1. AVR单片机与C语言的一些入门简要概述
  2. 【理财】3.富人思维
  3. 面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了!
  4. 友盟APM和bugly全面对比
  5. ESP8266 + MAX7219 做一个简易的自动同步的倒计时时钟
  6. (M)Dynamic Programming:309. Best Time to Buy and Sell Stock with Cooldown
  7. 第2章:Android的编译环境--build系统
  8. 2021年「博客之星」评选,期待大家为我送一个五星评分,谢谢
  9. 偶像来了 | 英雄请一起跳支舞!
  10. 租用游艇问题 石子合并问题 动态规划实验