GVKun编程网logo

如何记录Spring Data JPA存储库方法的执行时间?(spring data jpa调用存储过程)

23

在这篇文章中,我们将带领您了解如何记录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调用存储过程)

如何记录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存储库:阻止保存更新

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
}
最佳答案
当使用默认配置,并使用CrudRepository#save()或JpaRepository#save()时,它将委托给EntityManager,如果它是新实体则使用persists(),如果不是则使用merge().

当使用默认配置时,遵循以下策略来检测实体状态,无论是否为新,使用适当的方法如下:

>默认情况下,执行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存储库查询

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可能需要进行一些更改。

在我们的项目之一,我们用QueryDSLQueryDslPredicateExecutor<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自定义存储库,如何应用逻辑

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 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
}

我想:

  1. 使用单独的投影恢复所有relatedEntities关系。理想情况下,我希望这是一个分页集合,以防有很多关系。这可能吗?

  2. 过滤关系基于类型(例如 LIKES)

  3. 使用基于 id 的投影带来一个关系。

对我需要的回购方法的任何建议将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

今天关于如何记录Spring Data JPA存储库方法的执行时间?spring data jpa调用存储过程的分享就到这里,希望大家有所收获,若想了解更多关于java – Spring JPA存储库:阻止保存更新、Java带有任意AND子句的动态Spring Data JPA存储库查询、Spring Data JPA自定义存储库,如何应用逻辑、Spring Data Neo4j 关系存储库方法等相关知识,可以在本站进行查询。

本文标签: