为了排除实体某些字段,我创建了一个接口投影,仅返回一些字段。
我想在存储库接口(扩展Neo4jRepository)中添加一个使用Cypher编写的自定义查询方法(使用@Query注释)
如果将返回对象设置为实体,则此方法有效,但如果将返回对象设置为投影,则返回
示例代码: 也 - 我使用lombok,但我怀疑它在这里没有任何区别
我想在存储库接口(扩展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
}
需要注意的几点:
- 这个Cypher查询语句是百分百正确的。我在Neo4j桌面版上测试过了,它按预期工作。
- 当然,这个例子很简单,通常情况下我不需要一个自定义查询,但当一些更复杂的查询出现时,这个问题会再次出现。
- 正如我所说,使用实体而不是投影时,自定义查询方法是有效的。而在使用投影时,调试日志会显示
looking for concrete class to resolve label: Person
,所以也许它会强制使用实体?这是我想到的一个问题。 - 我正在使用最新版本的
spring-boot-starter-data-neo4j
。
有没有办法解决它?我该怎么做?如果无法修复,我还有其他的方法可以解决这个问题吗?