การจัดหาจำนวนตัวแปรของอาร์กิวเมนต์ให้กับโพรซีเดอร์ที่เก็บไว้ / SQL

ฉันมีตารางฐานข้อมูล เช่น CarTb และส่วนหน้าที่ให้คุณเลือกดูรถมือสองที่พร้อมขายได้

ที่ส่วนหน้า ฉันสามารถกรองได้มากหรือน้อยตามต้องการ - แสดงรถสีน้ำเงินทุกคัน, แสดงรถสีแดงทั้งหมดที่มี 4 ประตู, แสดงรถทุกคันที่มีหมายเลข rego XXX123 หรือความสามารถของ ipod และเครื่องเสียงสเตอริโอ 5 ลำโพง ฯลฯ

สิ่งที่ฉันต้องการทำบนแบ็คเอนด์ Java คือการสร้างระบบที่สืบค้นฐานข้อมูลแบบไดนามิกโดยขึ้นอยู่กับสิ่งที่ UI ส่งถึงฉัน ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะฉีดอาร์กิวเมนต์ทั้งสตริงลงใน proc ที่เก็บไว้แบบไดนามิก... เห็นได้ชัดว่าฉันรู้ว่าคุณสามารถแมปอาร์กิวเมนต์แต่ละรายการเช่น door=? และสี=? แล้วแทนที่ค่าต่างๆ... แต่แล้วการโต้แย้งของตัวแปรล่ะ เกือบจะเหมือนกับ Java vargs เลย

คุณจะต้องเลือก * จาก CarTb เสมอ มันเป็นเพียงส่วนคำสั่งที่อาจเป็นข้อใดข้อหนึ่งต่อไปนี้...

  • ประตูไหน = 4
  • โดยที่ประตู=5 และสี=แดง และ MP3=Y
  • โดยที่เทอร์โบ = Y หรือ เป่า = Y

คุณได้รับความคิด

มีข้อเสนอแนะอะไรบ้าง? เรามีสิทธิ์เข้าถึงโหมดไฮเบอร์เนตหากสิ่งนี้ช่วยได้ และฐานข้อมูล sybase (เช่น เราสามารถเขียน proc อื่นที่เก็บไว้เพื่อทำสิ่งนี้ได้หากจำเป็น)

--ไชโย เดฟ


person f1dave    schedule 18.05.2011    source แหล่งที่มา
comment
คุณมีสิทธิ์เข้าถึงฐานข้อมูลหรือไม่ (เช่น คุณสามารถเขียนขั้นตอนการจัดเก็บ) หรือคุณจำกัดการใช้ Java ไว้เท่านั้น   -  person Kit Z. Fox    schedule 18.05.2011
comment
ใช่ ... ฉันได้แก้ไขคำถามเดิมเพื่อสะท้อนให้เห็น   -  person f1dave    schedule 18.05.2011


คำตอบ (2)


คุณสามารถสร้างแบบสอบถามของคุณได้แบบไดนามิก แต่ยังคงมี doors=:param ตัวอย่างเช่น:

if (doorsSelected) {
    clauses.add("doors=:doors");
    paramNames.add("doors");
    values.add(doors);
}

if (engineSelected) {
    clauses.add("engine=:engine");
    params.put("engine", engine);
}

จากนั้นเพียงเข้าร่วมรายการอนุประโยค (เช่น การใช้ guava's Joiner):

String queryString = Joiner.on(" AND ").join(clauses);
Query query = session.createQuery(queryString);

จากนั้นทำซ้ำ params และ query.setParameter(key, value)

person Bozho    schedule 18.05.2011
comment
อืม... ดูเหมือนเป็นความคิดที่ดีนะ เมื่อเห็นว่าเราสามารถมีตัวเลือกได้ทุกประเภท (เช่น ไม่ใช่แค่ AND) เราไม่จำเป็นต้องแยกวิเคราะห์แบบกำหนดเองบางอย่างที่เกิดขึ้นเพื่อหาว่าจะวาง AND, OR, NOT ฯลฯ ไว้ที่ไหนตามต้องการ - person f1dave; 18.05.2011
comment
คุณสามารถเข้าร่วมใน StringBuilder ได้ถ้าคุณต้องการ หรือมีรายการแยกต่างหากสำหรับ andClauses, orClauses ฯลฯ - person Bozho; 18.05.2011

ฉันนึกถึงวิธีการโกงประเภทหนึ่งได้ แม้ว่าฉันจะจินตนาการ/หวังว่าข้อความค้นหาจะได้รับการปรับให้เหมาะสม คุณสามารถเพิ่ม args พิเศษในคำสั่งที่คุณเตรียมไว้สำหรับเงื่อนไขที่คุณต้องการเพิ่มซึ่งจะประเมินว่าเป็นจริงก็ต่อเมื่อมีฟิลด์นั้นอยู่

select ... 
  from ...
    where var1=? and <expression associated with that var1>  
    or var2=? and <expression associated with that var2>  
    or etc
person John Kane    schedule 18.05.2011