2

使用 Spring Boot 和 postgres。我在数据库中有分层数据,路径存储在 ltree 列中。我正在尝试根据路径获取特定对象,但无法查询数据库。

模型类:

@Entity
@Table(schema = "devschema", name = "family")

public class Family {

    @Id
    @Column(name = "member_id")
    private Long memId;

    @Column(name = "name")
    private String memName;

    @Column(name = "fam_path",  columnDefinition="ltree")
    private String familyPath;

    ... getters and setters
}

存储库类:

  public interface OrgRepository extends PagingAndSortingRepository <Family, Long>{

    public Family findByMemId(Long id);
    public Family findByMemName(String memName);

    @Query("select f from Family f where familyPath = ?1")
    public Family findByPath(String path);
    }

来自控制器的调用,将路径作为称为路径的字符串变量传递:

desiredMember = familyRepository.findByPath(path);

产生以下错误:

2016-02-15 20:41:06.430 ERROR 88677 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: operator does not exist: devschema.ltree = character varying
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  Position: 397
2016-02-15 20:41:06.449 ERROR 88677 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception  is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is  org.hibernate.exception.SQLGrammarException:  could not extract ResultSet] with root cause

org.postgresql.util.PSQLException: ERROR: operator does not exist: fhschema.ltree = character varying
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  Position: 397

我试图将 f 转换为文本,但无济于事。任何人都知道如何解决这个问题?

4

2 回答 2

1

您选择了错误的运算符。

@><@等可用的运算符如下所列:

postgres ltree 文档

于 2016-06-25T01:50:45.150 回答
0

PostgreSQL 文档https://www.postgresql.org/docs/current/static/ltree.html说 @> 运算符需要 gist 索引。我发现它在大型数据集上显着变慢。(我删除了它。)

所以我一直在满意地使用波浪号运算符。它不需要要点索引。

select * from Family where familyPath ~ '*.Smith.*'

或者,如果您知道这总是路径的尽头,请留下最后一个星号:

select * from Family where familyPath ~ '*.Smith'
于 2017-09-28T21:24:07.407 回答