ค้นหาเว็บไซต์

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();