eclipselink jpa 标准参考未映射列
eclipselink jpa criteria reference unmapped column
在编写 jpql 查询时,我可以使用 COLUMN() 引用未映射的列(我知道它是特定于 eclipselink 的)。
在使用 javax.persistence.criteria.CriteriaBuilder、javax.persistence.criteria.Predicate 等构建条件时,有什么方法可以引用未映射的列?
我面临的问题:我有带有全文搜索列的 postgresql table。我不希望它被映射到实体对象,但我想在查询中使用它(我还需要使用 CriteriaBuilder 进行查询)。
编辑:代码示例
我有一个 table: X (id integer, name varchar, fts tsvector)
"fts"列为全文搜索索引数据。
我需要没有 "fts" 属性的实体 class,例如:
@Entity class X {
@Id Integer id;
@Column String name;
}
以便永远不会获取 fts 数据(为了性能),但我需要能够查询该列。我可以用 jpql 做到这一点:
SELECT t FROM X t WHERE COLUMN('fts', t) IS NOT NULL;
但是在构建标准时如何引用此类列:
Specification<Fts> spec = new Specification<Fts>() {
@Override
public Predicate toPredicate(Root<Fts> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return builder.notNull(root.<String>get("fts"));
}
};
其他选择:
如何在引用 table 列但从未获取的实体 class 中添加属性?我尝试添加 @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()
}
};
在编写 jpql 查询时,我可以使用 COLUMN() 引用未映射的列(我知道它是特定于 eclipselink 的)。 在使用 javax.persistence.criteria.CriteriaBuilder、javax.persistence.criteria.Predicate 等构建条件时,有什么方法可以引用未映射的列?
我面临的问题:我有带有全文搜索列的 postgresql table。我不希望它被映射到实体对象,但我想在查询中使用它(我还需要使用 CriteriaBuilder 进行查询)。
编辑:代码示例
我有一个 table: X (id integer, name varchar, fts tsvector)
"fts"列为全文搜索索引数据。 我需要没有 "fts" 属性的实体 class,例如:
@Entity class X {
@Id Integer id;
@Column String name;
}
以便永远不会获取 fts 数据(为了性能),但我需要能够查询该列。我可以用 jpql 做到这一点: SELECT t FROM X t WHERE COLUMN('fts', t) IS NOT NULL;
但是在构建标准时如何引用此类列:
Specification<Fts> spec = new Specification<Fts>() {
@Override
public Predicate toPredicate(Root<Fts> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return builder.notNull(root.<String>get("fts"));
}
};
其他选择: 如何在引用 table 列但从未获取的实体 class 中添加属性?我尝试添加 @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()
}
};