在这篇文章中,我们将带领您了解如何记录SpringDataJPA存储库方法的执行时间?的全貌,包括springdatajpa调用存储过程的相关情况。同时,我们还将为您介绍有关java–SpringJP
在这篇文章中,我们将带领您了解如何记录Spring Data JPA存储库方法的执行时间?的全貌,包括spring data jpa调用存储过程的相关情况。同时,我们还将为您介绍有关java – Spring JPA存储库:阻止保存更新、Java带有任意AND子句的动态Spring Data JPA存储库查询、Spring Data JPA自定义存储库,如何应用逻辑、Spring Data Neo4j 关系存储库方法的知识,以帮助您更好地理解这个主题。
本文目录一览:- 如何记录Spring Data JPA存储库方法的执行时间?(spring data jpa调用存储过程)
- java – Spring JPA存储库:阻止保存更新
- Java带有任意AND子句的动态Spring Data JPA存储库查询
- Spring Data JPA自定义存储库,如何应用逻辑
- Spring Data Neo4j 关系存储库方法
如何记录Spring Data JPA存储库方法的执行时间?(spring data jpa调用存储过程)
我有简单的Spring Data JPA存储库。
public interface UserRepository extends JpaRepository<UserEntity, Serializable>{ … }
有什么方法可以监视Spring生成的方法的执行时间(例如findOne(…)
)?
答案1
小编典典最简单的方法是使用CustomizableTraceInterceptor
如下:
@Configuration@EnableAspectJAutoProxypublic class SpringDataExecutionLoggingConfiguration { @Bean public CustomizableTraceInterceptor customizableTraceInterceptor() { CustomizableTraceInterceptor customizableTraceInterceptor = new CustomizableTraceInterceptor(); customizableTraceInterceptor.setUseDynamicLogger(true); customizableTraceInterceptor.setExitMessage("Executed $[methodName] in $[invocationTime]"); return customizableTraceInterceptor; } @Bean public Advisor advisor() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression("execution(public * org.springframework.data.jpa.repository.CrudRepository+.*(..))"); return new DefaultPointcutAdvisor(pointcut, customizableTraceInterceptor()); }}
java – Spring JPA存储库:阻止保存更新
我的用户数据库表如下所示:
CREATE TABLE user (
username VARCHAR(32) PRIMARY KEY,first_name VARCHAR(256) NOT NULL,last_name VARCHAR(256) NOT NULL,password VARCHAR(32) NOT NULL,enabled BOOL
) ENGINE = InnoDB;
这是我的实体的字段定义:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
@Column(nullable = false)
private String password;
字段用户名是我的表/实体的密钥,由我来设置其值.
当我需要创建另一个用户时,我在我的服务中执行此操作:
public User insertUserImpl(String username,String firstName,String lastName) {
Assert.hasText(username);
Assert.hasText(firstName);
Assert.hasText(lastName);
String password = UUID.randomUUID().toString().substring(0,4); // temp
User user = new User(username,password);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEnabled(false);
this.userRepository.save(user);
// FIXME - assegnare un ruolo
return user;
}
无论如何,如果已经使用了用户名,则存储库只进行更新,因为指定的标识符不为空.这不是我想要的行为,我需要它抛出类似重复的条目异常.
有什么方法可以预防吗?我必须自己做吗?
例如.:
User user = this.userRepository.findOne(username);
if(user != null) {
throw new RuntimeException("Username already taken"); // FIXME - eccezione applicativa
}
当使用默认配置时,遵循以下策略来检测实体状态,无论是否为新,使用适当的方法如下:
>默认情况下,执行Property-ID检查,如果为null,则它是新实体,否则不是.
>如果实体实现Persistable,则检测将委托给实体实现的isNew()方法.
>有第三个选项,实现Entityinformation,但需要进一步的自定义.
source
因此,在您的情况下,当您使用用户名作为ID,并且它不为空时,Repository调用最终委托给EntityManager.merge()而不是persist().所以有两种可能的解决方案:
>使用不同的ID属性,将其设置为null,并使用任何自动生成方法,或
> make user实现Persistable并使用isNew()方法确定它是否是新实体.
如果由于某种原因,您不想修改实体,还可以更改修改刷新模式配置的行为.默认情况下,在spring数据jpa中,hibernate flush模式设置为AUTO.你想要做的是将它更改为COMMIT,并且要更改它的属性是org.hibernate.flushMode.您可以通过覆盖@Configuration类中的EntityManagerfactorybean来修改此配置.
如果您不想弄乱EntityManager的配置,可以使用JpaRepository#flush()或JpaRepository#saveAndFlush()方法将挂起的更改提交到数据库.
Java带有任意AND子句的动态Spring Data JPA存储库查询
我正在使用Spring data jpa repositories
,要求提供具有不同字段的搜索功能。搜索之前输入的字段是optional.I
有5场说EmployeeNumber,Name,Married,Profession和DateOfBirth
。
在这里我只需要查询用户给定的值,其他字段应该被忽略。
Input : EmployeeNumber: ,Name:St,Married: ,Professsion:IT,DateOfBirth: Query : Select * from Employee e where Name like ''St%'' and Profession like ''IT%''; Input : EmployeeNumber:10,Name: ,Married: ,Professsion:IT,DateOfBirth:Query : Select * from Employee e where EmployeeNumber like ''10%'' and Profession like ''IT%'';
因此,这里我们考虑输入的值和进行查询。在这种情况下,Spring数据是具有限制中提到的这篇文章(不可扩展,所有可能出现的问题,应书面)我使用的Querydsl
,但仍然存在问题的null领域应该被忽视,需要开发的几乎所有可能出现的问题。在这case 31 queries
。如果搜索字段是6,7,8...
?
用可选字段实现搜索选项的最佳方法是什么?
答案1
小编典典请注意,使用新的主要版本的QueryDSL(4.x)和querydsl-jpa可能需要进行一些更改。
在我们的项目之一,我们用QueryDSL
用QueryDslPredicateExecutor<T>
。
public Predicate createPredicate(DataEntity dataEntity) { QDataEntity qDataEntity = QDataEntity.dataEntity; BooleanBuilder booleanBuilder = new BooleanBuilder(); if (!StringUtils.isEmpty(dataEntity.getCnsiConsumerNo())) { booleanBuilder .or(qDataEntity.cnsiConsumerNo.contains(dataEntity.getCnsiConsumerNo())); } if (!StringUtils.isEmpty(dataEntity.getCnsiMeterNo())) { booleanBuilder.or(qDataEntity.cnsiMeterNo.contains(dataEntity.getCnsiMeterNo())); } return booleanBuilder.getValue(); }
我们可以在存储库中使用它:
@Repositorypublic interface DataEntityRepository extends DaoRepository<DataEntity, Long> {哪里DaoRepository是@NoRepositoryBeanpublic interface DaoRepository<T, K extends Serializable> extends JpaRepository<T, K>, QueryDslPredicateExecutor<T> {}
因为这样,您可以使用存储库谓词方法。
Iterable<DataEntity> results = dataEntityRepository.findAll(dataEntityPredicateCreator.createPredicate(dataEntity));
要获取QClasses,您需要在pom.xml中指定QueryDSL APT Maven插件。
<build> <plugins> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>maven-apt-plugin</artifactId> <version>1.0.4</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources</outputDirectory> <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>
依赖项是
<!-- querydsl --> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-core</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency>
或对于Gradle:
sourceSets { generated}sourceSets.generated.java.srcDirs = [''src/main/generated'']configurations { querydslapt}dependencies { // other deps .... compile "com.mysema.querydsl:querydsl-jpa:3.6.3" compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa"}task generateQueryDSL(type: JavaCompile, group: ''build'', description: ''Generates the QueryDSL query types'') { source = sourceSets.main.java classpath = configurations.compile + configurations.querydslapt options.compilerArgs = [ "-proc:only", "-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor" ] destinationDir = sourceSets.generated.java.srcDirs.iterator().next()}compileJava { dependsOn generateQueryDSL source generateQueryDSL.destinationDir}compileGeneratedJava { dependsOn generateQueryDSL classpath += sourceSets.main.runtimeClasspath}
Spring Data JPA自定义存储库,如何应用逻辑
我尝试实现JPA自定义存储库。
我有一个这样的过滤器对象:
public class FilterPatient {
private String surname;
private String name;
private String cf;
... and so on
}
从前端,我根据用户输入创建FilterPatient的实例。
因此,例如,用户可以值姓和cf属性或值和姓,等等。
我想实现一个自定义存储库,如下所示:
PatientRepository extends JpaRepository<Patient,Long> {
List<Patient> findBySurname(String surname);
List<Patient> findByName(String name);
List<Patient> findByCf(String cf);
// custom methods:
@Query("select p from Patient p where p.name = :name
and p.surname = :surname")
List<Patient> findByNameAndSurname(@Param("name") String name,@Param("surname") String surname);
... and so on
}
题:
根据用户输入,我必须执行其他查询,那么如何管理存储库?我必须编写查询方法以涵盖输入字段的不同组合,并且必须在服务中编写有关方法存储库调用的逻辑?或者我可以更好地自定义方法查询参数化?
其他信息:
通常,在没有spring-
data的情况下,我使用输入参数定义了DAO方法FilterPatient
,因此我基于不为null的参数构建查询,然后用query.setString
方法替换参数。通过这种方式,我编写了一个通用方法,Spring-
data和JPA存储库是否可能?
编辑
用户查询示例
SELECT FROM Patient p WHERE p.name = :name
AND p.surname = :surname
AND p.cf = :cf
和其他可能的配置,例如,在FilterPatient IS NULL的cf属性中,查询将变为:
SELECT FROM Patient p WHERE p.name = :name
AND p.surname = :surname
Spring Data Neo4j 关系存储库方法
如何解决Spring Data Neo4j 关系存储库方法?
我使用的是 Spring Boot 2.5.2 和 Spring Data Neo4j 6.1.2。我已经设法编写了一些 repo 方法来检索我需要使用 Projection DTO 的实体详细信息,但我不确定如何编写用于带回关系信息的存储库方法。
这是我的实体和关系类:
Node("Entity")
@Data
public class Entity {
@Id
@GeneratedValue(UUIDStringGenerator.class)
private String id;
private String name;
private String description;
@Compositeproperty()
private Map<String,Object> properties;
@Relationship
private Map<String,RelatedEntity> relatedEntities = new HashMap<>();
// other fields
}
@RelationshipProperties
@Data
public class RelatedEntity {
@Id
@GeneratedValue()
private Long id;
@TargetNode
private Entity relEntity;
@Compositeproperty()
private Map<String,Object> properties;
// other fields
}
我想:
-
使用单独的投影恢复所有的
relatedEntities
关系。理想情况下,我希望这是一个分页集合,以防有很多关系。这可能吗? -
过滤关系基于类型(例如 LIKES)
-
使用基于 id 的投影带来一个关系。
对我需要的回购方法的任何建议将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
今天关于如何记录Spring Data JPA存储库方法的执行时间?和spring data jpa调用存储过程的分享就到这里,希望大家有所收获,若想了解更多关于java – Spring JPA存储库:阻止保存更新、Java带有任意AND子句的动态Spring Data JPA存储库查询、Spring Data JPA自定义存储库,如何应用逻辑、Spring Data Neo4j 关系存储库方法等相关知识,可以在本站进行查询。
本文标签: