Spring Data Neo4j仓库中,接口投影无法使用自定义查询

5
为了排除实体某些字段,我创建了一个接口投影,仅返回一些字段。
我想在存储库接口(扩展Neo4jRepository)中添加一个使用Cypher编写的自定义查询方法(使用@Query注释)
如果将返回对象设置为实体,则此方法有效,但如果将返回对象设置为投影,则返回null。 投影与正常存储库方法一起工作(没有自定义查询)。
示例代码: 也 - 我使用lombok,但我怀疑它在这里没有任何区别
@NodeEntity
@Data
public class Person {
  @Id
  @GeneratedValue
  private Long id;
  @Property("first_name")
  private String firstName;
  @Property("last_name")
  private String lastName;
  @Property("is_man")
  private boolean isMan;

PersonProjection.java

public interface PersonProjection {
  Long getId();
  String getFirstName();
  boolean getIsMan();
}

PersonRepository.java

public interface PersonRepository extends Neo4jRepository<Person, Long> {
  @Query("MATCH (n:`Person`) WHERE n.`is_man` = true WITH n RETURN n")
  List<PersonProjection> findMen(); // doesn't work, returns null

  List<PersonProjection> findAllByIsManTrue(); // works, returns the list of men
}

需要注意的几点:

  1. 这个Cypher查询语句是百分百正确的。我在Neo4j桌面版上测试过了,它按预期工作。
  2. 当然,这个例子很简单,通常情况下我不需要一个自定义查询,但当一些更复杂的查询出现时,这个问题会再次出现。
  3. 正如我所说,使用实体而不是投影时,自定义查询方法是有效的。而在使用投影时,调试日志会显示 looking for concrete class to resolve label: Person,所以也许它会强制使用实体?这是我想到的一个问题。
  4. 我正在使用最新版本的 spring-boot-starter-data-neo4j

有没有办法解决它?我该怎么做?如果无法修复,我还有其他的方法可以解决这个问题吗?


你尝试过使用@QueryResult (org.springframework.data.neo4j.annotation.QueryResult)为PersonProjection进行注释吗? - Amit
我已经完成了。它返回了一个带有正确字段的JSON对象,但它们都是“null”。 我还收到了一个警告,但我无法确定它是否相关:“QueryResult接口方法toString似乎不是getter,因此可能无法返回正确的结果。” - Oskar Pawica
1个回答

0
  1. 你的接口需要添加 @QueryResult 注解
  2. 你使用的查询在 SDN(Spring Data Neo4j)中无法工作,返回结果时需要进行轻微修改,示例如下: @Query("MATCH (n:Person) WHERE n.is_man = true WITH n RETURN ID(n) as id,n.first_name as firstName, n.is_man as isMan")

然后它就可以工作了。以下是一个正常工作的示例。

 @QueryResult
public interface PersonProjection {
    String getName();
}
  public interface PersonRepository extends Neo4jRepository<Person, Long> {

   
    @Query("MATCH (pr:Person) return pr.name as name")
    public List<PersonProjection> getPersonWithAllFriends();

   

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接