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