typescript - CreateQueryBuilder ไม่ส่งคืนข้อมูลกับ Oracle เพราะ TypeORM สร้าง SQL เป็นตัวพิมพ์เล็กและมีเครื่องหมายคำพูด
ฉันกำลังพยายามสร้างคำสืบค้นเล็ก ๆ ไปยัง Oracle โดยใช้ createQueryBuilder แต่ไม่พบข้อมูล
ฉันสังเกตเห็นว่า TypeORM สร้าง SQL เป็นตัวพิมพ์เล็กและมีเครื่องหมายคำพูด (เช่นนี้: SELECT "m"."codigo" AS "m_codigo", "m"."descripcion" AS "m_descripcion" FROM "moneda" "Moneda", "moneda" "m") และนี่คือสาเหตุที่เกิดปัญหาใน Oracle เพราะเมื่อฉันลบเครื่องหมายคำพูดหรือ ... ฉันแปลงคำสั่ง SQL ให้เป็นตัวพิมพ์ใหญ่ มันก็จะคืนค่าข้อมูล
รหัส :
import { EntityRepository, getRepository, Repository , Entity, Column, PrimaryColumn} from "typeorm";
@Entity()
export class Moneda {
@PrimaryColumn()
codigo?: number;
@Column()
descripcion?: string;
@Column()
simbolo?: string;
@Column()
decimales?: number;
}
@EntityRepository(Moneda)
export class MonedaRepository extends Repository<Moneda> {
constructor() { super() }
async getListaMonedas(){
return await getRepository(Moneda).createQueryBuilder()
.select( ["m.codigo", "m.descripcion"] )
.from( Moneda, "m" )
.getMany();
}
}
//in another file...
import { MonedaRepository } from "./store";
const monedaRepository = new MonedaRepository();
const monedas = await monedaRepository.getListaMonedas();
console.log(monedas);
// result: [ ]
คำตอบ #1
วิธีแก้ปัญหาถูกให้กับฉันโดย @Mukyuu คุณต้องระบุชื่อของเอนทิตีใน Entity ("TABLE") ที่เขียนด้วยตัวอักษรใหญ่ และใน querybuilder แทนที่จะใช้ getMany() ... ใช้ getRowMany() ... (ชื่อตารางคอลัมน์ต้องเขียนด้วยตัวอักษรใหญ่เช่นกัน) :
const result = await getRepository (Currency) .createQueryBuilder ("M")
.select (["M.CODIGO", "M.DESCRIPCION"])
.getRawMany ();
นี่ใช้ได้ผลสำหรับฉัน
คำตอบ #2
โดยค่าเริ่มต้น ตัวระบุของ Oracle (ชื่อตาราง ชื่อคอลัมน์ เป็นต้น) จะไม่แยกตัวพิมพ์ใหญ่พิมพ์เล็ก คุณสามารถทำให้มันแยกตัวพิมพ์ใหญ่พิมพ์เล็กได้โดยการใส่เครื่องหมายคำพูดรอบๆ ตัวมัน
ใส่ชื่อคอลัมน์ของคุณด้วยเครื่องหมายอัญประกาศเดี่ยวโดยไม่ต้องมีชื่อเล่น เช่น
const result = await getRepository(Currency)
.createQueryBuilder()
.select(['"CODIGO"', '"DESCRIPCION"'])
.getRawMany();
