Thank you for the demo project! I’ve debugged the problem and found the cause.
In general, QueryConditionProcessor works correctly. You just need to provide the entity name to the ConditionGenerationContext. Without the entityName, the ConditionJpqlGenerator cannot determine whether the property is a cross-data-store reference or not.
The bean with fix:
@Component
public class QueryConditionProcessor {
public record QueryWithParameters(String query, Map<String, Object> parameters) {
}
private final ConditionJpqlGenerator conditionJpqlGenerator;
private final ParameterJpqlGenerator parameterJpqlGenerator;
public QueryConditionProcessor(ConditionJpqlGenerator conditionJpqlGenerator, ParameterJpqlGenerator parameterJpqlGenerator) {
this.conditionJpqlGenerator = conditionJpqlGenerator;
this.parameterJpqlGenerator = parameterJpqlGenerator;
}
public QueryWithParameters process(String query, Condition condition, String entityName) {
Condition actualizedCondition = condition.actualize(Set.of(), true);
if (actualizedCondition != null) {
ConditionGenerationContext conditionGenerationContext = new ConditionGenerationContext(actualizedCondition);
conditionGenerationContext.setEntityName(entityName); // set entity name
String processedQuery = conditionJpqlGenerator.processQuery(query, conditionGenerationContext);
Map<String, Object> parameters = new HashMap<>();
parameterJpqlGenerator.processParameters(parameters, parameters, actualizedCondition, entityName);
return new QueryWithParameters(processedQuery, parameters);
} else {
return new QueryWithParameters(query, Collections.emptyMap());
}
}
}