How to Express SELECT * FROM t WHERE id = ? OR (name = ? AND age = ?) by Objects Only?

Forb Yuan - Aug 24 - - Dev Community

To answer this question, we need to understand a new concept first: the WHERE clause is not flat but hierarchical. Within this structure, query conditions connected by AND form one level, and query conditions connected by OR form another. The logical connector for each layer is either AND or OR. Typically, multiple query conditions are connected using AND, which is considered the first level by default. Therefore, in the query statement mentioned in the title, the two conditions connected by OR are at the second level, and the two conditions within the second OR condition connected by AND are at the third level.

Using JSON to represent this hierarchical structure might make it clearer:

{
  "userOr": {
    "id": 5,
    "userAnd": {
      "name": "John",
      "age": 30
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

When converting this JSON structure into a WHERE clause, we can determine the logical connectors between multiple query conditions based on the suffixes And/Or in the key names. Since there's only one key, userOr, at the first level, the AND connector can be omitted. The multiple conditions under userOr are connected using OR. The first key corresponds to the condition id = 5, while the multiple conditions of the second key, name = "John" and age = 30, are connected with AND according to the suffix And. These conditions are then enclosed in parentheses and combined with id = 5 using OR, resulting in the corresponding query clause: id = 5 OR (name = "John" AND age = 30). When constructing query conditions, the parameters can be replaced with placeholders.

Next, let's try to construct such a JSON object using Java:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserQuery {
  private Integer id;
  private String name;
  private Integer age;
  private UserQuery userOr;
  private UserQuery userAnd;

  public static void main(String[] args) throws Exception {
    UserQuery userAnd = UserQuery.builder().name("John").age(30).build();
    UserQuery userOr = UserQuery.builder().id(5).userAnd(userAnd).build();
    UserQuery userQuery = UserQuery.builder().userOr(userOr).build();

    ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
    System.out.println(objectMapper.writeValueAsString(userQuery));
    // Output: {"userOr":{"id":5,"userAnd":{"name":"John","age":30}}}
  }
}
Enter fullscreen mode Exit fullscreen mode

Although this approach may be a bit cumbersome, it allows us to construct the same JSON object, which means we can generate the same query clause. Furthermore, since this query condition can be represented in JSON format, it implies that any programming language supporting JSON can be used to construct such query conditions. The next step is to attempt to implement this solution in different programming languages.

. . .
Terabox Video Player