eclipselink jpa标准引用未映射的列



在编写jpql查询时,我可以使用COLUMN()引用未映射的列(我知道它是特定于eclipselink的)。在使用javax.persistence.criteria.Writer、javax.persstence.critoria.Predicate等构建标准时,有什么方法可以引用未映射的列吗?

我面临的问题是:我有一个带有全文搜索列的postgresql表。我不希望它被映射到实体对象,但我想在查询中使用is(我还需要使用CriteriaBuilder进行查询)。


编辑:代码示例

我有一个表:X(id integer,name varchar,fts-tsvector)

"fts"列是全文搜索索引数据。我需要没有"fts"属性的实体类,比如:

@Entity class X {
    @Id Integer id;
    @Column String name;
}

因此,fts数据永远不会被提取(为了性能),但我需要能够查询该列。我可以用jpql做到这一点:从X t中选择t,其中列('fts',t)不为空;

但是当构建诸如之类的标准时,我如何引用这样的列

Specification<Fts> spec = new Specification<Fts>() {
        @Override
        public Predicate toPredicate(Root<Fts> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            return builder.notNull(root.<String>get("fts"));
        }
    };

其他选择:如何在实体类中添加引用表列但从未提取的属性?我尝试添加@Basic(fetchType=fetchType.LAZY),但它不起作用,值是在查询时提取的。。。

好的。我设法用这种方式解决了这个问题:

Specification<Fts> spec = new Specification<Fts>() {
        @Override
        public Predicate toPredicate(Root<Fts> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            JpaCriteriaBuilder cb = (JpaCriteriaBuilder) builder;
            List<String> args = new ArrayList();
            args.add("FTS query");
            javax.persistence.criteria.Expression<Boolean> expr = cb.fromExpression(
              cb.toExpression(
                cb.function("", Boolean.class, cb.fromExpression(((RootImpl) root).getCurrentNode().getField("fts")))
              )
              .sql("? @@ to_tsquery(?)", args)
            );
            // getField() allows to reference column not mapped to Entity
            query.where(expr);
            return null; // or return cb.isTrue(expr); and then not need to set query.where()
        }
    };

最新更新