diff --git a/README.en.md b/README.en.md index 7e42476595c7d24b5f71a0589df0ee97e4082adc..57d4d39538f927e9537200154a74cc1e9df9e1c1 100644 --- a/README.en.md +++ b/README.en.md @@ -545,6 +545,54 @@ where ( 2022-06-21 16:03:05.676 INFO 53945 --- [main] c.e.e.b.c.q.sql.EsSqlExecuteHandler: http://localhost:9200/_sql?format=json 2022-06-21 16:03:05.676 INFO 53945 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT id, personNo, personName, phone, salary, company, status, sex, address, createTime, createUser FROM person_es_index WHERE (personNo = 'US2022060100001' AND status = 4)"} ```` +#### 3.4 Return table query (take mybatis as an example) + +1) Add the corresponding es query annotation to the mapper interface + +````java + +@EsQueryIndex("person_es_index") +@Mapper +public interface PersonMapper { + + @MybatisEsQuery(backColumn = "id",backColumnType = Long.class) + List findBySex(@Param("sex") Integer sex); + +} +```` + +3) Test example + +````java + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class EsEngineExtendMybatisQueryTest { + @Resource + private PersonMapper personMapper; + + /** + * Return form query test id + */ + @Test + public void testSqlBackById() { + List results = personMapper.findBySex(1); + System.out.println(JsonParser.asJson(results)); + } +} +```` + +4) Query effect + +```` +2022-06-22 00:46:23.302 INFO 7723 --- [main] c.e.e.m.i.MybatisEsQueryInterceptor: raw sql: SELECT * FROM person WHERE sex = ? +2022-06-22 00:46:23.347 INFO 7723 --- [main] c.e.e.m.i.MybatisEsQueryInterceptor : After rewriting sql: SELECT id FROM person_es_index WHERE sex = ? +2022-06-22 00:46:23.348 INFO 7723 --- [main] c.e.e.m.i.MybatisEsQueryInterceptor : After replacing parameters sql: SELECT id FROM person_es_index WHERE sex = 1 +2022-06-22 00:46:23.349 INFO 7723 --- [main] c.e.e.b.c.q.sql.EsSqlExecuteHandler: http://localhost:9200/_sql?format=json +2022-06-22 00:46:23.349 INFO 7723 --- [main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT id FROM person_es_index WHERE sex = 1"} +2022-06-22 00:46:24.480 INFO 7723 --- [main] c.e.e.m.i.MybatisEsQueryInterceptor : return table sql : SELECT * FROM person WHERE sex = ? AND id IN (7, 13, 17, 6, 9, 14, 16 , 23, 24) +```` ## Usage example diff --git a/README.md b/README.md index 037c1f08adcf137a46dcc73ea1f08f4f2c75b905..8424d1add3b04866224b06894e1d9ecb6f0be2e2 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,27 @@ public class EsEngineProxySqlQueryTest { ### 3.扩展查询 -#### 3.1 mybatis +#### 3.1 扩展查询说明 + +##### 3.1.1扩展查询原理 + +###### 1)普通查询 +拦截orm框架执行过程中生成的sql, 对sql进行改写后, 查询es返回结果 + +###### 2)回表查询 +拦截orm框架执行过程中生成的sql, 对sql进行改写后, 查询es返回唯一索引,通过唯一索引查询 mysql返回明细 + +##### 3.1.1 sql改写规则 + +①替换表名为es索引名 + +②清除关联查询 + +③清除from,where,group by,having,order by 中的表别名(t.xx,d.xx) + +#### 3.2 扩展查询示例 + +##### 3.2.1 mybatis 1)添加maven依赖 @@ -399,7 +419,7 @@ public class EsEngineExtendMybatisQueryTest { 2022-06-21 15:54:48.076 INFO 53454 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT * FROM person_es_index WHERE personNo = 'US2022060100001' AND status = 1"} ``` -#### 3.2 jpa +##### 3.2.2 jpa 1)添加maven依赖 @@ -457,7 +477,7 @@ public class EsEngineExtendJpaQueryTest { 2022-06-21 16:00:21.010 INFO 53773 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT id, address, company, createTime, createUser, personName, personNo, phone, salary, sex, status FROM person_es_index WHERE personNo = 'US2022060100001' AND status = 1"} ``` -#### 3.3 jooq +##### 3.2.3 jooq 1)添加maven依赖 @@ -546,6 +566,123 @@ where ( 2022-06-21 16:03:05.676 INFO 53945 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : http://localhost:9200/_sql?format=json 2022-06-21 16:03:05.676 INFO 53945 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT id, personNo, personName, phone, salary, company, status, sex, address, createTime, createUser FROM person_es_index WHERE (personNo = 'US2022060100001' AND status = 4)"} ``` +##### 3.2.4 关联查询(以mybatis为例) +###### 3.2.4.1 关联查询说明 +1)应用场景 + +elasticsearch 存储的字段为mysql多张表聚合的字段,mysql 原本的查询为关联多表查询 + +###### 3.2.4.2 关联查询示例 +1)mapper接口添加对应的es查询注解 + +```java + +@EsQueryIndex("person_es_index") +@Mapper +public interface PersonExtendMapper { + int insertList(List persons); + + @MybatisEsQuery + List queryList(@Param("status") Integer status, @Param("hobby")String hobby); +} + +``` + +3)测试示例 + +```java + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class EsEngineExtendMybatisQueryTest { + @Resource + private PersonExtendMapper personExtendMapper; + + /** + * 关联查询测试 + */ + @Test + public void testJoinQueryList() { + List results = personExtendMapper.queryList(4,"踢足球"); + System.out.println(JsonParser.asJson(results)); + } +} +``` + +4)查询效果 + +``` +2022-06-23 00:23:00.012 INFO 37281 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 原始sql: SELECT * FROM person p INNER JOIN person_extend pe + ON p.person_no = pe.person_no + WHERE p.status = ? AND pe.hobby=? +2022-06-23 00:23:00.052 INFO 37281 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 改写后sql: SELECT * FROM person_es_index WHERE status = ? AND hobby = ? +2022-06-23 00:23:00.053 INFO 37281 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 替换参数后sql: SELECT * FROM person_es_index WHERE status = 4 AND hobby = '踢足球' +2022-06-23 00:23:00.054 INFO 37281 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : http://localhost:9200/_sql?format=json +2022-06-23 00:23:00.054 INFO 37281 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT * FROM person_es_index WHERE status = 4 AND hobby = '踢足球'"} +``` + +##### 3.2.5 回表查询(以mybatis为例) +###### 3.2.5.1 回表查询说明 +1)应用场景 + + ① elasticsearch 存储的非全量字段,而只有搜索字段, 通过es搜索唯一索引后,再用唯一索引回表查询mysql + + ② elasticsearch 存在延迟,通过es搜索出es搜索唯一索引后,再用唯一索引回表查询mysql + +2)sql改写规则 + + ① es执行的sql,再原改写的基础上 改写查询字段仅查询回表字段 + + ② 回表sql, 再原orm框架sql基础上拼接 es执行结果的回表查询条件 + +###### 3.2.5.2 回表查询示例 +1)mapper接口添加对应的es查询注解 + +```java + +@EsQueryIndex("person_es_index") +@Mapper +public interface PersonMapper { + + @MybatisEsQuery(backColumn = "id",backColumnType = Long.class) + List findBySex(@Param("sex") Integer sex); + +} +``` + +3)测试示例 + +```java + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class EsEngineExtendMybatisQueryTest { + @Resource + private PersonMapper personMapper; + + /** + * 回表查询测试 id + */ + @Test + public void testSqlBackById() { + List results = personMapper.findBySex(1); + System.out.println(JsonParser.asJson(results)); + } +} +``` + +4)查询效果 + +``` +2022-06-22 00:46:23.302 INFO 7723 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 原始sql: SELECT * FROM person WHERE sex = ? +2022-06-22 00:46:23.347 INFO 7723 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 改写后sql: SELECT id FROM person_es_index WHERE sex = ? +2022-06-22 00:46:23.348 INFO 7723 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 替换参数后sql: SELECT id FROM person_es_index WHERE sex = 1 +2022-06-22 00:46:23.349 INFO 7723 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : http://localhost:9200/_sql?format=json +2022-06-22 00:46:23.349 INFO 7723 --- [ main] c.e.e.b.c.q.sql.EsSqlExecuteHandler : {"query":"SELECT id FROM person_es_index WHERE sex = 1"} +2022-06-22 00:46:24.480 INFO 7723 --- [ main] c.e.e.m.i.MybatisEsQueryInterceptor : 回表sql : SELECT * FROM person WHERE sex = ? AND id IN (7, 13, 17, 6, 9, 14, 16, 23, 24) +``` ## 使用示例 diff --git a/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/parse/sql/SqlParserHelper.java b/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/parse/sql/SqlParserHelper.java index ce4a303e6371cb3b493ab3575a559a5e4ae6ba55..1dbe9de8cbac627749ffc521c2b1868cf37417e8 100644 --- a/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/parse/sql/SqlParserHelper.java +++ b/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/parse/sql/SqlParserHelper.java @@ -96,12 +96,13 @@ public class SqlParserHelper { * @throws Exception */ private static void setBackWhereItem(PlainSelect plain, BackDto backDto, List esResult) throws Exception { + String tableName = StringUtils.isEmpty(backDto.getTableName()) ? getTableName(plain) : backDto.getTableName(); //ColumnName es驼峰 转 mysql下划线 String backColumn = backDto.getBackColumn(); if (!EsEngineConfig.isNamingStrategy()) { backColumn = CaseFormatUtils.camelToUnderscore(backColumn); } - String backSql = " " + backColumn + " in (" + SqlParamParseHelper.getListParameterValue(esResult) + ")"; + String backSql = " " + tableName + "." + backColumn + " in (" + SqlParamParseHelper.getListParameterValue(esResult) + ")"; if (StringUtils.isNotEmpty(backSql)) { if (plain.getWhere() == null) { plain.setWhere(CCJSqlParserUtil.parseCondExpression(backSql)); @@ -111,6 +112,21 @@ public class SqlParserHelper { } } + /** + * 获取表名(关联查询时 表名为主表表名) + * + * @param plain + * @return + */ + public static String getTableName(PlainSelect plain) { + FromItem fromItem = plain.getFromItem(); + String fromItemName = ""; + if (fromItem instanceof Table) { + fromItemName = ((Table) fromItem).getName(); + } + return fromItem.getAlias() == null ? fromItemName : fromItem.getAlias().getName(); + } + /** * TODO 获取索引名的方法抽取通用方法 * 替换表名 diff --git a/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/proxy/handler/impl/EsAnnotationQuery.java b/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/proxy/handler/impl/EsAnnotationQuery.java index 29e37195d8d211785146328b904729bec7a5038b..5221ccfb1887eccec5a5073658b3c4b08896453e 100644 --- a/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/proxy/handler/impl/EsAnnotationQuery.java +++ b/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/proxy/handler/impl/EsAnnotationQuery.java @@ -53,7 +53,7 @@ public class EsAnnotationQuery implements EsQueryProxyExecuteHandler { //有一个或多个参数 && 都是基础类型(包括List,LocalDateTime,LocalDate,BigDecimal) queryEnum = EsAnnotationQueryEnum.ANNOTATION_PARAM_QUERY; } else { - throw new EsEngineQueryException(prefix + "方法参数异常: 查询参数不被支持,仅支持多个基本类型参数 或 者单个引用类型的参数并标记@EsQueryIndex注解"); + throw new EsEngineQueryException(prefix + "方法参数异常: 查询参数不被支持,仅支持单个引用类型的参数 or 一个或多个基本类型参数(包括List)"); } return esAnnotationQueryFactory.getBean(queryEnum).handle(proxy, method, args); } diff --git a/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/model/domain/BackDto.java b/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/model/domain/BackDto.java index 31c88017c03953d45d412c0bef18fac1d928fa59..965e574dc0c5a3a586fc404e461fb4bed24639f5 100644 --- a/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/model/domain/BackDto.java +++ b/elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/model/domain/BackDto.java @@ -17,6 +17,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class BackDto { + private String tableName; private String backColumn; private Class backColumnTyp; diff --git a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/annotion/JooqEsQuery.java b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/annotion/JooqEsQuery.java index 615ef33ea8bf6d7fd25bf643bd1aad2495bb722c..32fd4ae1b46027de819818d3e877d2bb09b37379 100644 --- a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/annotion/JooqEsQuery.java +++ b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/annotion/JooqEsQuery.java @@ -13,6 +13,13 @@ import java.lang.annotation.*; @Documented public @interface JooqEsQuery { + /** + * 回表字段所属的表名或别名 + * + * @return + */ + String tableName() default ""; + /** * 回表字段 * diff --git a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/aop/JooqEsQueryAop.java b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/aop/JooqEsQueryAop.java index 17946c5d097446af2555db7131265a9c85204406..980cf8272ae2ac37fe30940ec12547622d9cae15 100644 --- a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/aop/JooqEsQueryAop.java +++ b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/aop/JooqEsQueryAop.java @@ -5,10 +5,12 @@ import com.elasticsearch.engine.base.common.utils.ThreadLocalUtil; import com.elasticsearch.engine.base.config.EsEngineConfig; import com.elasticsearch.engine.base.model.constant.CommonConstant; import com.elasticsearch.engine.base.model.domain.BackDto; +import com.elasticsearch.engine.base.model.exception.EsEngineExecuteException; import com.elasticsearch.engine.base.model.exception.EsEngineJpaExecuteException; import com.elasticsearch.engine.jooq.model.JooqBackDto; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -64,8 +66,12 @@ public class JooqEsQueryAop { //无需回表直接执行es查询 result = esSqlQueryHelper.esQuery(method, e.getMessage(), args, backDto); } else { - //需要回表es查询并回表查询 - List esResult = esSqlQueryHelper.esQueryBack(method, e.getMessage(), args, backDto); + //回表sql执行, sql重新时使用 原生未绑定参数的sql + String bakSql = ThreadLocalUtil.remove(CommonConstant.JPA_NATIVE_SQL); + if (StringUtils.isEmpty(bakSql)) { + throw new EsEngineExecuteException("jpa 回表sql异常"); + } + List esResult = esSqlQueryHelper.esQueryBack(method, bakSql, args, backDto); if (CollectionUtils.isEmpty(esResult)) { return result; } @@ -74,6 +80,7 @@ public class JooqEsQueryAop { } finally { ThreadLocalUtil.remove(CommonConstant.IS_ES_QUERY); ThreadLocalUtil.remove(CommonConstant.BACK_QUERY_SQL); + ThreadLocalUtil.remove(CommonConstant.JPA_NATIVE_SQL); } return result; } diff --git a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/listener/JooqEsQueryExecuteListener.java b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/listener/JooqEsQueryExecuteListener.java index 3dce0106283de9f5e7d7adcf08fe07ce1bd143e6..3c49a3c08df0cceec5c761661494c25f9731e83f 100644 --- a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/listener/JooqEsQueryExecuteListener.java +++ b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/listener/JooqEsQueryExecuteListener.java @@ -37,21 +37,35 @@ public class JooqEsQueryExecuteListener extends DefaultExecuteListener implement /** * 解析完sql + * * @param ctx */ @Override public void renderEnd(ExecuteContext ctx) { + //非es查询 + if (Objects.isNull(ThreadLocalUtil.get(CommonConstant.IS_ES_QUERY))) { + return; + } + if (StringUtils.isEmpty(ctx.sql())) { + return; + } + //非select语句直接返回 + if (!Objects.requireNonNull(ctx.sql()).startsWith(CommonConstant.SELECT_SQL_PREFIX_LOWER) && !Objects.requireNonNull(ctx.sql()).startsWith(CommonConstant.SELECT_SQL_PREFIX_UPPER)) { + return; + } String backSql = ThreadLocalUtil.get(CommonConstant.BACK_QUERY_SQL); if (StringUtils.isNotEmpty(backSql)) { //test // ctx.sql("SELECT `user`.`person`.`id`, `user`.`person`.`person_no`, `user`.`person`.`person_name`, `user`.`person`.`phone`, `user`.`person`.`salary`, `user`.`person`.`company`, `user`.`person`.`status`, `user`.`person`.`sex`, `user`.`person`.`address`, `user`.`person`.`create_time`, `user`.`person`.`create_user` FROM `user`.`person` WHERE `user`.`person`.`status` = ? AND person_no IN ('US2022060100001', 'US2022060100023')"); ctx.sql(backSql); - ThreadLocalUtil.remove(CommonConstant.IS_ES_QUERY); + } else { + ThreadLocalUtil.set(CommonConstant.JPA_NATIVE_SQL, ctx.sql()); } } /** * 执行结束 + * * @param ctx */ @Override @@ -75,17 +89,23 @@ public class JooqEsQueryExecuteListener extends DefaultExecuteListener implement /** * 绑定完sql参数 + * * @param ctx */ @Override public void bindEnd(ExecuteContext ctx) { + Boolean isEsQuery = ThreadLocalUtil.get(CommonConstant.IS_ES_QUERY); + if (Objects.isNull(isEsQuery)) { + return; + } String sql = ctx.query().toString(); //非select语句直接返回 if (!sql.trim().startsWith(CommonConstant.SELECT_SQL_PREFIX_LOWER) && !sql.trim().startsWith(CommonConstant.SELECT_SQL_PREFIX_UPPER)) { return; } - Boolean isEsQuery = ThreadLocalUtil.remove(CommonConstant.IS_ES_QUERY); - if (Objects.nonNull(isEsQuery) && isEsQuery) { + String backSql = ThreadLocalUtil.get(CommonConstant.BACK_QUERY_SQL); + + if (StringUtils.isEmpty(backSql)) { throw new EsEngineJpaExecuteException(sql); } } diff --git a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/model/JooqBackDto.java b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/model/JooqBackDto.java index 887f362284f1a6c14bb8dc31cb60ac4919b263af..9fc0c1ca922b00eff221ae0de8ffe2657316b3f8 100644 --- a/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/model/JooqBackDto.java +++ b/elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/model/JooqBackDto.java @@ -18,9 +18,10 @@ public class JooqBackDto extends BackDto { public static BackDto hasJooqBack(Method method) { JooqEsQuery esQuery = method.getAnnotation(JooqEsQuery.class); String backColumn = esQuery.backColumn(); + String tableName = esQuery.tableName(); Class backColumnTyp = esQuery.backColumnType(); if (StringUtils.isNotEmpty(backColumn) && Objects.nonNull(backColumnTyp) && !backColumnTyp.equals(Objects.class)) { - return BackDto.builder().backColumn(backColumn).backColumnTyp(backColumnTyp).build(); + return BackDto.builder().tableName(tableName).backColumn(backColumn).backColumnTyp(backColumnTyp).build(); } return null; } diff --git a/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/Inspector/JpaEsQueryStatementInspector.java b/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/Inspector/JpaEsQueryStatementInspector.java index 23f7801d660ced3f26389872669e3f177b4b3ec0..c250b6ea02909f40a28522d60015439c9ebad806 100644 --- a/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/Inspector/JpaEsQueryStatementInspector.java +++ b/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/Inspector/JpaEsQueryStatementInspector.java @@ -6,6 +6,8 @@ import org.apache.commons.lang3.StringUtils; import org.hibernate.resource.jdbc.spi.StatementInspector; import org.springframework.stereotype.Component; +import java.util.Objects; + /** * @author wanghuan * @description jpa sql切es查询拦截器 @@ -50,6 +52,10 @@ public class JpaEsQueryStatementInspector implements StatementInspector { @Override public String inspect(String sql) { + //非es查询 + if (Objects.isNull(ThreadLocalUtil.get(CommonConstant.IS_ES_QUERY))) { + return sql; + } //非select语句直接返回 if (!sql.startsWith(CommonConstant.SELECT_SQL_PREFIX_LOWER) && !sql.startsWith(CommonConstant.SELECT_SQL_PREFIX_UPPER)) { return sql; diff --git a/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/annotion/JpaEsQuery.java b/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/annotion/JpaEsQuery.java index 0531e786867ac5b6b735866fd152e906553ae491..65e623161dd8dfe2883da932f3d33c7920aa0887 100644 --- a/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/annotion/JpaEsQuery.java +++ b/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/annotion/JpaEsQuery.java @@ -13,6 +13,13 @@ import java.lang.annotation.*; @Documented public @interface JpaEsQuery { + /** + * 回表字段所属的表名或别名 + * + * @return + */ + String tableName() default ""; + /** * 回表字段 * diff --git a/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/model/JpaBackDto.java b/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/model/JpaBackDto.java index 2338677c6b1f3d3efbdc050c256adcc30221c11f..59b0786f1d87c6d6ec23b3f4be69810af8708d5a 100644 --- a/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/model/JpaBackDto.java +++ b/elasticsearch-engine-jpa/src/main/java/com/elasticsearch/engine/jpa/model/JpaBackDto.java @@ -18,9 +18,10 @@ public class JpaBackDto extends BackDto { public static BackDto hasJpaBack(Method method) { JpaEsQuery esQuery = method.getAnnotation(JpaEsQuery.class); String backColumn = esQuery.backColumn(); + String tableName = esQuery.tableName(); Class backColumnTyp = esQuery.backColumnType(); if (StringUtils.isNotEmpty(backColumn) && Objects.nonNull(backColumnTyp) && !backColumnTyp.equals(Objects.class)) { - return BackDto.builder().backColumn(backColumn).backColumnTyp(backColumnTyp).build(); + return BackDto.builder().tableName(tableName).backColumn(backColumn).backColumnTyp(backColumnTyp).build(); } return null; } diff --git a/elasticsearch-engine-jpa/src/main/java/org/hibernate/type/descriptor/sql/BasicBinder.java b/elasticsearch-engine-jpa/src/main/java/org/hibernate/type/descriptor/sql/BasicBinder.java index d59c996f457df82500da14d13d2628429ed800db..7e13dd12df913a41493164a2e1b525a4f1685cdb 100644 --- a/elasticsearch-engine-jpa/src/main/java/org/hibernate/type/descriptor/sql/BasicBinder.java +++ b/elasticsearch-engine-jpa/src/main/java/org/hibernate/type/descriptor/sql/BasicBinder.java @@ -82,6 +82,10 @@ public abstract class BasicBinder implements ValueBinder { * @param statement */ private void inspect(PreparedStatement statement) { + //非es查询 + if (Objects.isNull(ThreadLocalUtil.get(CommonConstant.IS_ES_QUERY))) { + return; + } String st = statement.toString(); //bind方法会被多次调用,解析一个参数调用一次 //包含 NOT SPECIFIED 说明jpa参数解析还未完成, 直接返回让继续解析. 等全部解析完成再处理后续逻辑 @@ -93,9 +97,8 @@ public abstract class BasicBinder implements ValueBinder { if (!sql.trim().startsWith(CommonConstant.SELECT_SQL_PREFIX_LOWER) && !sql.trim().startsWith(CommonConstant.SELECT_SQL_PREFIX_UPPER)) { return; } - Boolean isEsQuery = ThreadLocalUtil.get(CommonConstant.IS_ES_QUERY); - if (Objects.nonNull(isEsQuery) && isEsQuery) { - ThreadLocalUtil.remove(CommonConstant.IS_ES_QUERY); + Boolean isEsQuery = ThreadLocalUtil.remove(CommonConstant.IS_ES_QUERY); + if (Objects.nonNull(isEsQuery)) { throw new EsEngineJpaExecuteException(sql); } } diff --git a/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/annotion/MybatisEsQuery.java b/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/annotion/MybatisEsQuery.java index 0ef2daf28475a585c812b6348ef8f7867ba10cad..6d562c5183a0e91e4a33eb9bec9adc5ff95e4a33 100644 --- a/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/annotion/MybatisEsQuery.java +++ b/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/annotion/MybatisEsQuery.java @@ -13,6 +13,14 @@ import java.lang.annotation.*; @Documented public @interface MybatisEsQuery { + + /** + * 回表字段所属的表名或别名 + * + * @return + */ + String tableName() default ""; + /** * 回表字段 * diff --git a/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/model/MybatisBackDto.java b/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/model/MybatisBackDto.java index 817ae6a110466c2e66571cd3cec4403e6b683469..766751883adc0d45d97c8be6d4bca9f851183b6c 100644 --- a/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/model/MybatisBackDto.java +++ b/elasticsearch-engine-mybatis/src/main/java/com/elasticsearch/engine/mybatis/model/MybatisBackDto.java @@ -18,9 +18,10 @@ public class MybatisBackDto extends BackDto { public static BackDto hasBack(Method method) { MybatisEsQuery esQuery = method.getAnnotation(MybatisEsQuery.class); String backColumn = esQuery.backColumn(); + String tableName = esQuery.tableName(); Class backColumnTyp = esQuery.backColumnType(); if (StringUtils.isNotEmpty(backColumn) && Objects.nonNull(backColumnTyp) && !backColumnTyp.equals(Objects.class)) { - return BackDto.builder().backColumn(backColumn).backColumnTyp(backColumnTyp).build(); + return BackDto.builder().tableName(tableName).backColumn(backColumn).backColumnTyp(backColumnTyp).build(); } return null; }