java - 为 Spring Data Neo4j 创建动态查询

标签 java neo4j spring-data-neo4j

我有两个实体:

@NodeEntity
public class User {

@Id
@GeneratedValue
private Long id;

private String firstName;

private String lastName;

@Relationship(type = "IN")
private Department department;

}

@NodeEntity
public class Department {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
}

我需要一个搜索名字、姓氏和部门 ID 的逻辑。 我查看了存储库方法,但找不到解决方案,因为我的查询是动态的(搜索查询中可以有 0 或 3 个参数)。

此类任务的最佳解决方案是什么?现在我设法通过手动查询构建和 session 对象来做到这一点,如下所示:

StringBuilder builder = new StringBuilder("MATCH (user:User)-[:IN]->(department:Department) WHERE ");
 if (departmentId != null) {
        builder.append(String.format("ID(department) = %s", departmentId));
        builder.append(" AND ");
 }
 ...
List<User> userList  =  Lists.newArrayList(session.query(User.class,builder.toString(), Collections.emptyMap()));

但它看起来很丑,我想找到更好的解决方案。 谢谢!

最佳答案

CASE expressions您可以获取密码查询中的所有逻辑:

MATCH (U:User)-[:IN]->(D:Department) WHERE
  CASE WHEN NOT $firstName IS NULL 
    THEN U.firstName = $search.firstName 
    ELSE TRUE 
  END AND
  CASE WHEN NOT $lasrName IS NULL 
    THEN U.lastName = $lastName 
    ELSE TRUE 
  END AND
  CASE WHEN NOT $departmentId IS NULL 
    THEN ID(D) = $departmentId 
    ELSE TRUE 
  END    
RETURN *

关于java - 为 Spring Data Neo4j 创建动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50076997/

相关文章:

java - 如何在hql查询中将列的枚举类型转换为整数?

java - 我应该关闭 FileChannel 吗?

java - Neo4j 中两个节点之间的所有路径与 TraversalDescription 返回不正确的路径

java - 无法解析 Eclipse 中的 Neo4j 注释

spring - 我无法更新 spring data neo4j 版本

java - 当我单击注销按钮时,如何阻止 Android 应用程序将挂起位置发送到网络服务器?

java - 使用 BaseActivity 进行 OnResume 操作栏样式设置

javascript - Neo4j 仅当 where 子句始终为真时才返回 Node

database - 在 Neo4J 数据库上使用 Jena 推理器

neo4j - 如何从neo4j中的2种不同关系获取出发时间和到达时间