Java eclipselink jpa标准参考未映射列

Java eclipselink jpa标准参考未映射列,java,eclipselink,jpa-2.0,Java,Eclipselink,Jpa 2.0,在编写jpql查询时,我可以使用COLUMN()引用未映射的列(我知道它是特定于eclipselink的)。 在使用javax.persistence.criteria.CriteriaBuilder、javax.persistence.criteria.Predicate等构建条件时,是否有任何方法可以引用未映射列 我面临的问题是:我有一个带有全文搜索列的postgresql表。我不希望它映射到实体对象,但我希望在查询中使用is(我还需要使用CriteriaBuilder进行查询) 编辑:代

在编写jpql查询时,我可以使用COLUMN()引用未映射的列(我知道它是特定于eclipselink的)。 在使用javax.persistence.criteria.CriteriaBuilder、javax.persistence.criteria.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"));
        }
    };
Specification spec=新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){
返回builder.notNull(root.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()
        }
    };
Specification spec=新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){
JpaCriteriaBuilder cb=(JpaCriteriaBuilder)builder;
List args=new ArrayList();
参数添加(“FTS查询”);
javax.persistence.criteria.expr=cb.fromExpression表达式(
cb.toExpression(
cb.function(“”,Boolean.class,cb.fromExpression(((RootImpl)root.getCurrentNode().getField(“fts”))
)
.sql(“?@@to_tsquery(?”,args)
);
//getField()允许引用未映射到实体的列
查询。其中(expr);
返回null;//或返回cb.isTrue(expr);然后不需要设置query.where()
}
};

请输入代码。“未映射列”是什么意思?“Transient”是实体中未映射到数据库列的相反大小写属性。请不要误会,但对我来说,您的问题更像是糟糕的设计问题。将fts放在单独的实体/表中,然后将获取类型定义为lazy。这意味着关系另一端的类只有在被请求时才会被加载。我认为在表中有我不想被提取的列并没有错,但我仍然希望在查询中使用它们。FTS数据是一种情况,空间数据是另一种情况-您不需要获取数据,但希望找到与某个区域匹配的记录。。。考虑一个查询:从FTS匹配“xxx”和空间匹配“区域”的表中选择(全部但“fts”和‘空格’列);您应该能够执行
cb.toExpression(root)
,而不是
((RootImpl)root).getCurrentNode()
,这会产生更干净的代码IMHO