Apparently (and unfortunately) true. Unless someone speaks up and
says there is a way to get Torque to do prepared statements for
addIn, I'm going to have to convert our code to use OR instead of IN.
Raul
On Mar 7, 2008, at 7:06 AM, Brendan Miller wrote:
Also, on the topic of addIn() and in-lists, is it true that
Torque does not generate prepared statements with bind variables
for the in list elements?
Brendan
On Thu, Mar 06, 2008 at 08:11:18PM -0500, Greg Monroe wrote:
I traced out the code and found that the applicable
section of code is the SQLExpression.processInValue
method. This is called with each member of the list
or array specified.
This tests if the object is a String or not. If it's
a string, it calls quoteAndEscapeText. However, if
it's not a String, it just calls the object's toString()
method.
The problem is that there is no clean way to determine
if this type of object is supposed to be a quoted string
or an unquoted string. Suppose that it's a list of
Integer or Float objects? To wrap these in quotes would
be wrong in this case.
Hmm, I suppose the code could use the DataMap structure
to look up the SQL field type and then decide. But that
assumes that the "Column" part of the IN is a true
table column. Also, some thought would need to go into
how to make this not be a performance issue.
-----Original Message-----
From: Brendan Miller [mailto:[EMAIL PROTECTED]
Sent: Thursday, March 06, 2008 6:54 PM
To: [email protected]
Subject: Criteria.addIn on List or Object[] doesn't generate quoted
strings?
I am trying to use the addIn() method of the Criteria class.
I have a table with various states. I would like to query objects
whose
state is in a list I define.
I have defined my states thusly:
public enum State { NEW, ACTIVE, SUSPENDED, CANCELED };
I have used both
crit.addIn(ServicePeer.State, new ArrayList<State> {{
add(State.NEW);
add(State.ACTIVE);
}});
and
crit.addIn(ServicePeer.State, { State.NEW, State.ACTIVE });
Both generate SQL as
SELECT SERVICE.ID, ... FROM SERVICE WHERE SERVICE.STATE IN
(NEW,ACTIVE)
Obviously, NEW and ACTIVE need to be quoted. If I pass a List or
array
of Strings, of course it works just fine. (I know I can get a
list or
array of Strings by calling .toString() on my enum values.)
But the documentation says:
Adds an 'IN' clause with the criteria supplied as an Object
array. For
example:
FOO.NAME IN ('FOO', 'BAR', 'ZOW')
where 'values' contains three objects that evaluate to the
respective
strings above when .toString() is called.
This led me to believe that .toString() would be called
internally. I
guess it is (as I get the string literals in the SQL), but the
strings
are not quoted. Shouldn't they be?
Is this a bug, or am I misreading the documentation? If it's a bug,
I'd be happy to enter a JIRA and attempt a patch.
Brendan
--------------------------------------------------------------------
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
DukeCE Privacy Statement:
Please be advised that this e-mail and any files transmitted with
it are confidential communication or may otherwise be privileged or
confidential and are intended solely for the individual or entity
to whom they are addressed. If you are not the intended recipient
you may not rely on the contents of this email or any attachments,
and we ask that you please not read, copy or retransmit this
communication, but reply to the sender and destroy the email, its
contents, and all copies thereof immediately. Any unauthorized
dissemination, distribution or copying of this communication is
strictly prohibited.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]