سؤال

لدي الاستعلام المسمى التالي في السبات:

<sql-query name="CreateLogTable">
  CREATE TABLE IF NOT EXISTS :tableName (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `url` VARCHAR (750) NOT NULL, 
    `query` VARCHAR (500), 
    `ipaddress` VARCHAR (39), 
    `datetime` DATETIME NOT NULL, 
    `hits` MEDIUMINT UNSIGNED DEFAULT '0' NOT NULL, 
    `path_id` VARCHAR (8), 
    PRIMARY KEY(`id`),
    UNIQUE(`id`),
    INDEX(`id`,`query`,`datetime`,`path_id`)
  ) TYPE = MyISAM
</sql-query>

أحاول بعد ذلك تنفيذ هذا الخط باستخدام السطر التالي (يشير الثوابت إلى العناصر الصحيحة):

getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "wibble").executeUpdate();

الآن عند تنفيذ التعليمات البرمجية، أحصل على خطأ SQL فيما يتعلق باسم الجدول الذي يخرج محاطا به اقتباسات:

CREATE TABLE IF NOT EXISTS 'wibble' (

إذا كنت تأخذ الاستعلام الذي تم إنشاؤه وإحاولة ذلك دون علامات الاقتباس حول اسم الجدول، فإن الاستعلام يعمل بشكل جيد. انها مجرد تلك علامات الاقتباس مما تسبب في مشكلتي.

لذلك سؤالي هو: ماذا أحتاج لاستخدامها بدلا من setString للتأكد من أن المعلمة لا تحيط بها اقتباسات؟ لقد حاولت setParameter مع عدم وجود حظ ولم أستطع اكتشاف أي بديل أفضل من API.

شكرا لأي إدخال، لي

هل كانت مفيدة؟

المحلول

لا أعتقد أنه يمكنك استخدام المعلمات المسماة لمعرفات قاعدة البيانات مثل أسماء الجدول. تعبيرات القيمة فقط. إذا سمح، فسيجعلك عرضة لهجمات حقن SQL. كبديل، يمكنك بناء الاستعلام في جافا.

نصائح أخرى

ما نوع قاعدة البيانات التي تستخدمها؟ بعض قواعد البيانات حساسة لحالة الأحرف (في الواقع أكثر ما عدا Microsoft). لذلك يختلف الجدول المسمى "Wibbible" عن "Wibbile" ولا يزال مختلفا عن "Wibbible".

عند إنشاء جدول يدعى Wibbile بدون علامات اقتباس، فإن معظم قواعد البيانات مثل Oracle قم بإنشاء هذا كجدول يدعى في جميع الأحمق "Wibbied". عند الاستعلام عن ذلك، يمكنك استخدامه كما تفعل هنا:

SELECT * FROM wibble

ستفسر قاعدة البيانات هذا ك "Wibbible" وليس هناك مشكلة.

يبدو مزود الثبات دائما وضع هذا في اقتباسات. لجعل الاسم المقتبس كما تم إنشاؤه كما، يجب عليك الاستفادة منه. لذلك جرب هذا:

getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "WIBBLE").executeUpdate();

يجب أن ينشئ ذلك البيان مع "Wibbible" والتي يجب أن تكون هي نفسها أثناء عدم وجود عروض أسعار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top