我正在使用Oracle和QueryDsl版本5.0.0。我有以下Oracle SQL查询:
SELECT /*+ parallel(2)*/ *
FROM (
WITH temp AS (
SELECT name1, name2 FROM names
--Dynamic filters are added here from client)
SELECT name1 AS name FROM temp
UNION ALL (SELECT name2 AS name FROM temp)
);
过滤器示例-其中name1是John或Adam:
[…]
WITH temp AS (
SELECT name1, name2
FROM names
WHERE name1 IN (‘John’, ‘Adam’))
[…]
我的代码:
请注意,this.getConditions(Request request)
返回包含客户端发送的过滤器的BooleanBuilder。
@Autowired
private JdbcTemplate jdbcTemplate;
private final QNames namesTable = QNames.names;
private final QNames withTable = new Qnames("with");
public List<String> getNames(Request request) throw Exception {
Connection conn = this.jdbcTemplate.getDataSource().getConnection();
OracleQuery<Names> withQuery = new OracleQuery<Names>(conn)
.select(Projections.constructor(
Names.class,
this.namesTable.name1.as(this.withTable.name1),
this.names.name2.as(this.withTable.name2))
)
.from(this.names)
.where(this.getConditions(request));
OracleQuery<String> name1Query = new OracleQuery<String>(conn)
.select(this.withTable.name1.as("name"))
.from(this.withTable);
OracleQuery<String> name2Query = new OracleQuery<String>(conn)
.select(this.withTable.name2.as(“name”))
.from(this.withTable);
OracleQuery<String> fullQuery = new OracleQuery<String>(conn)
.with(this.withTable, withQuery);
fullQuery.unionAll(name1Query, name2Query);
return fullQuery.fetch();
}
我不知道如何在这段代码中添加并行。
我尝试添加以下代码来代替返回行:
OracleQuery<String> parallelFullQuery = new OracleQuery<String>(conn)
.select(fullQuery)
.addFlag(QueryFlag.Position.START, "select /*+ parallel(2)*/ * from (")
.addFlag(QueryFlag.Position.END, ")")
.from(fullQuery);
return parallelFullQuery.fetch();
但是它覆盖了WITH子句。
有什么想法吗?
谢谢你。
1条答案
按热度按时间dly7yett1#
您可以通过提供查询注解对定制的Hibernate
Dialect
执行此操作,可以通过JPA查询提示org.hibernate.comment
设置注解,然后在Dialect
中通过实现addSqlHintOrComment
应用该注解