# 七、Columns类

在代码内部这个类比较常见，就单独讲解一下，该类主要是用于对列进行处理并将普通的字符转换为sql所需要的格式。\
普通的列名经过这里处理之后是要变成这样的格式：

```
name -> `name`
table.name -> table.`name`
name as n -> `name` as n
name n -> `name` n
table.name as n -> table.`name` as n
```

## 1.初始化 <a href="#chu-shi-hua" id="chu-shi-hua"></a>

```java
public static Columns of(String... fields) {}
public static Columns of(List<Field> fieldList) {}

// 获取表tableName的所有列名
public static Columns from(Neo neo, String tableName) {}
// 获取某个类的所有列
public static Columns from(Class tClass) {}
// 根据类型转换获取类的属性转换
public static Columns from(Class tClass, NamingChg namingChg) {}

// 设置列的前缀，和cs(String... cs)结合使用，用于表示列的前缀
public static Columns table(String tableName){}
public static Columns table(String tableName, Neo neo){}
```

## 2.多表的处理 <a href="#duo-biao-de-chu-li" id="duo-biao-de-chu-li"></a>

在使用多表的时候，我们可以直接使用of函数，将所有的列放进去，不过也可以使用下面的方式

```java
public static Columns table(String tableName){}
public static Columns table(String tableName, Neo neo){}

public Columns cs(String... cs){}
public Columns cs(Set<String> fieldSets) {}
```

```java
@Test
public void tableCsTest1() {
  // tableName.`c2`, tableName.`c3`, tableName.`c1`
  Assert.assertEquals(Columns.of("tableName.`c2`", "tableName.`c3`", "tableName.`c1`"),
                      Columns.table("tableName").cs("c1", "c2", "c3"));
}

/**
 * 多表的数据字段
 */
@Test
public void tableCsTest3() {
  String table1 = "table1";
  String table2 = "table2";
  String table3 = "table3";
  Columns columns = Columns.table(table1).cs("a1", "b1")
    .and(table2).cs("a2", "b2")
    .and(table3).cs("a3", "b3");

  // table3.`b3`, table1.`b1`, table1.`c1`, table1.`a1`, table2.`c2`, table2.`b2`, table2.`a2`, table3.`a3`
  show(columns.buildFields());
  Assert.assertEquals(Columns.of("table1.`a1`", "table1.`b1`", "table2.`a2`", "table2.`b2`", "table3.`a3`", "table3.`b3`"), columns);
}
```

## 3.表所有列处理 <a href="#biao-suo-you-lie-chu-li" id="biao-suo-you-lie-chu-li"></a>

针对需要表的所有列的时候，平常是用"*"，但是sql规范中是不建议使用"*"，我们可能需要手写，而手写又太多了，那么我们这里增加这样的写法，在使用符号“\*”的时候要传入库对象Neo，否则会报异常。

```java
/**
* 获取所有的列名 "*"
*/
@Test
public void allColumnTest1() {
  // neo_table1.`group`, neo_table1.`user_name`, neo_table1.`age`, neo_table1.`id`, neo_table1.`name`
  Columns columns = Columns.table("neo_table1", neo).cs("*");

  Assert.assertEquals(Columns.of("neo_table1.`group`", "neo_table1.`user_name`", "neo_table1.`age`", "neo_table1.`id`", "neo_table1.`name`"),
                      columns);
}

/**
 * 获取所有的列名 "*"，有多余的列，则会覆盖
 */
@Test
public void allColumnTest2() {
  // neo_table1.`group`, neo_table1.`user_name`, neo_table1.`age`, neo_table1.`id`, neo_table1.`name`
  Columns columns = Columns.table("neo_table1", neo).cs("*", "group");
  Assert.assertEquals(Columns.of("neo_table1.`group`", "neo_table1.`user_name`", "neo_table1.`age`", "neo_table1.`id`", "neo_table1.`name`"), columns);
}

/**
 * 获取所有的列名 "*"，如果有别名，则以别名为主
 */
@Test
public void allColumnTest3() {
  // neo_table1.`user_name`, neo_table1.`age`, neo_table1.`group` as g, neo_table1.`id`, neo_table1.`name`
  Columns columns = Columns.table("neo_table1", neo).cs("*", "group as g");
  Assert.assertEquals(Columns.of("neo_table1.`group` as g", "neo_table1.`user_name`", "neo_table1.`age`", "neo_table1.`id`", "neo_table1.`name`"), columns);
}
```

## 4.列别名处理 <a href="#lie-bie-ming-chu-li" id="lie-bie-ming-chu-li"></a>

针对别名处理的时候，我们这里支持这么两种方式：as 方式和空格方式

```java
@Test
public void aliasTest1(){
  // `c1` s c11, `c2`, `c3`
  show(Columns.of("`c1` as c11", "`c2`", "`c3`"));
}

@Test
public void aliasTest2(){
  // `c1` c11, `c2`, `c3`
  show(Columns.of("c1 c11", "`c2`", "`c3`"));
}

@Test
public void aliasTest3(){
  // `c1`  c11, `c3`
  show(Columns.of("c1  c11", "`c1`", "`c3`").buildFields());
}

@Test
public void aliasTest4(){
  // table.`c1`  c11, `c3`
  show(Columns.of("table.c1  c11", "`c1`", "`c3`").buildFields());
}
```

别名中，我们会将有别名的列和对应的列认为是相同的列

## 4.表别名处理

针对别名处理的时候，我们这里支持这么两种方式：as 方式和空格方式

```java
@Test
public void aliasTest1(){
  // `c1` s c11, `c2`, `c3`
  show(Columns.of("`c1` as c11", "`c2`", "`c3`"));
}

@Test
public void aliasTest2(){
  // `c1` c11, `c2`, `c3`
  show(Columns.of("c1 c11", "`c2`", "`c3`"));
}

@Test
public void aliasTest3(){
  // `c1`  c11, `c3`
  show(Columns.of("c1  c11", "`c1`", "`c3`").buildFields());
}

@Test
public void aliasTest4(){
  // table.`c1`  c11, `c3`
  show(Columns.of("table.c1  c11", "`c1`", "`c3`").buildFields());
}
```

别名中，我们会将有别名的列和对应的列认为是相同的列


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://simons.gitbook.io/neo/columns.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
