Создать динамический запрос для Spring Data Neo4j - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть две сущности:

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

Мне нужна логика для поиска firstName, lastName и 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()));

Но это выглядит ужасно, и я хочу найти лучшее решение. Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2018

С CASE expressions вы можете взять всю логику внутри запроса cypher:

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 *
...