当前位置: 首页 > 知识库问答 >
问题:

使用Neo4j为Spring数据JPA绑定QueryDSL

陆卓
2023-03-14

我们有Spring Data JPA的功能,我们在其中使用querydsl,如下所示

这是我的实体:

@Entity
@RestResource(path = "car", rel = "car")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = false)   
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CarEntity extends VehicleEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long inventoryId;

    @Column(length = 50)
    private String make;

    @Column(length = 50)
    private String model;

    @Column(length = 500)
    private String vin;

    @Column(length = 500)
    private String type;
}

这是我的知识库:

@RepositoryRestResource(path = "car")
@CrossOrigin(origins = "*")
public interface CarEntityRepository extends PagingAndSortingRepository<CarEntity, Long>,
        QueryDslPredicateExecutor<CarEntity>, QuerydslBinderCustomizer<QCarEntity> {

    @Override
    default public void customize(QuerydslBindings bindings, QCarEntity root) {
       bindings.bind(String.class).first(
                (StringPath path, String value) -> path.likeIgnoreCase(value));
    }}  

通过上面的代码,我能够实现QueryDSL功能,并根据实体中的任何字段查询实体。

现在,当我们从sql server迁移到Neo4j时,这里是我的实体

@NodeEntity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class CarEntity extends VehicleEntity {
@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long inventoryId;

    @Column(length = 50)
    private String make;

    @Column(length = 50)
    private String model;

    @Column(length = 500)
    private String vin;

    @Column(length = 500)
    private String type;
}

这是我的知识库

@CrossOrigin("*")
public interface CarRepository extends 
           Neo4jRepository<CarEntity,Long> {} 

这些是我的Neo4j应用程序的一些版本和属性

springBootVersion = '2.0.4.RELEASE'
dependencies {

    // Neo4j
    compile ('org.neo4j:neo4j:3.4.9')
    compile ('org.neo4j.driver:neo4j-java-driver:1.7.2')
    compile('org.springframework.boot:spring-boot-starter-data-neo4j')
    compile ('org.hibernate.ogm:hibernate-ogm-neo4j:5.4.1.Final')

    // Spring
    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile('org.springframework.boot:spring-boot-starter-data-rest')
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-web')

    //lombok
    compileOnly('org.projectlombok:lombok:1.18.2')

    // Testing
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.neo4j:neo4j-ogm-embedded-driver:3.1.11')
    testCompile('org.neo4j.test:neo4j-harness:3.4.9')

    // HTTP (Requesting token for integration tests)
    testCompile('junit:junit')
    testCompile("com.jayway.restassured:rest-assured:$restAssuredVersion")
    testCompile "org.springframework:spring-test:$springVersion"
    testCompile("com.squareup.retrofit2:retrofit:$retrofitVersion")
    testCompile("com.squareup.retrofit2:converter-jackson:$retrofitVersion")

}

在构建了使用Neo4J的应用程序后,它没有生成QCarEntity类,也无法绑定以实现QueryDSL提供的IgnoranceCase等功能。

任何人都可以知道是否有任何库可用于绑定Neo4j实体以及如何在进行构建时生成QCarEntity类

我已经这样尝试过了

public interface CarEntityRepository extends Neo4jRepository<CarEntity,Long>, PagingAndSortingRepository<CarEntity, Long>, QueryDslPredicateExecutor<CarEntity>, QuerydslBinderCustomizer<QCarEntity> {

@Override
default public void customize(QuerydslBindings bindings, QCarEntity root) {
    bindings.bind(String.class).first(
            (StringPath path, String value) -> path.likeIgnoreCase(value));
} 
}

它无法构建并且无法生成QCarEntity类,如果真的生成了QCarEntit,有没有办法实现此功能?Neo4j中是否有类似的类或库

共有1个答案

丌官玺
2023-03-14

Spring数据Neo4j不支持QueryDSL。

可以在此页面的表格中检查支持的存储库功能

您会注意到不支持QueryDslPredicateExector。

根据Gerrit Meier的说法,近期没有实施计划。

 类似资料:
  • 在我的@Repository接口中,我使用包含参数(addressType)的JPQL@Query创建了自定义查找方法。 在该方法中,我没有在参数上指定@Param(“addressType”)。所以我要 java.lang.IllegalArgumentException:参数绑定的名称不能为空或空!对于命名参数,您需要使用@Param查询Java版本上的方法参数 好的,这很清楚,但是我用的是J

  • 我开始使用Neo4j和Spring Data Neo4j的项目。我希望我的程序使用已经包含我的数据的本地数据库(而不是每次启动时加载数据),因为我有很多数据需要加载到数据库中。为了实现这个目标,我尝试设置一个用我的数据填充数据库的测试用例。但是,在我的测试完成后,数据库中的数据似乎不会持久:我使用neo4j控制台/shell查看数据库,发现它是空的。 我已经构建了一个小的例子项目,也不工作。任何对

  • > 我在SpringJira上发现了关于使用@Version属性进行乐观锁定的问题。 在实现这一点之前,我如何使用典型的存储库模式来处理这个问题?

  • 我目前正在从事一个利用Spring数据Neo4j的项目。每当创建节点时,我都希望创建一个包含创建日期和用户的引用审核节点。 我提出的一个解决方案是编写一个AOP方面,它与我的服务层的create方法挂钩。这对于没有级联的实体很好,但是级联的实体呢?它们没有在我的服务层中显式传递,因此我的AOP类不会拦截它们。JPA中是否有类似实体侦听器的概念,或者如何连接到该机制中?

  • 我在OpenJFX中使用Spring JPA。这个项目是JavaFX weaver,只需在pom中添加spring启动数据jpa。 然而,我的Spring JPA的开始时间是15-20秒,在Spring初始化之前,UI不会显示。当用户启动应用程序时,每次都要花很多时间! 作为一种解决方法,我尝试创建一个没有Spring的简单java fx应用程序(在这里使用这个演示),然后从main方法开始,通过

  • Neo4j 2.0。0已发布。所以我更新了neo4j版本2.0。0.M6到2.0。0.0发布。并尝试在我的网站中更新模型,但出现异常。 组织。springframework。刀。DataIntegrityViolationException:唯一属性类java。lang.String rankStatId rel:false idx:true被设置为重复值3073631_99 MY SDN版本是2