2008-10-10 50 views
49

Tengo un problema al utilizar el objeto java.text.MessageFormat.Java MessageFormat - ¿Cómo puedo insertar valores entre comillas simples?

Estoy tratando de crear instrucciones de inserción de SQL. El problema es que cuando hago algo como esto:

MessageFormat messageFormat = "insert into {0} values ('{1}', '{2}', '{3}', {4})"; 
Object[] args = { str0, str1, str2, str3, str4 }; 
String result = messageFormat.format(args); 

consigo esto por el valor de result:

"insert into <str0> values ({1}, {2}, {3}, <str4>)" 

Como se puede ver, el problema es que ninguno de los lugares de destino que estén encerrados entre comillas simples no son reemplazados por argumentos. He intentado utilizar comillas simples dobles como esta: ''{1}'' y caracteres escapados como este: \'{1}\' pero todavía da el mismo resultado.

editar: Olvidé mencionar que también probé '''{1}'''. El resultado es: "insert into <str0> values ('{1}', '{2}', '{3}', <str4>)". Mantiene las comillas originales pero aún no inserta los valores.

¿Cómo puedo resolver este problema? Para el registro, estoy usando JDK 6u7.

+1

Resulta que ''' {0} ''' funciona después de todo. Solo necesitaba hacer una limpieza completa de mi directorio de compilación, ya que mi proceso de compilación no se actualizaba correctamente y no me di cuenta. Oops! –

+0

[Esta respuesta] (http://stackoverflow.com/questions/17569608/format-a-message-using-messageformat-format-in-java#17569639) explica el motivo por el que se necesita una cotización adicional. –

Respuesta

91

simplemente he intentado comillas dobles y funcionó bien para mí:

MessageFormat messageFormat = new MessageFormat("insert into {0} values (''{1}'', ''{2}'', ''{3}'', {4})"); 
Object[] args = {"000", "111", "222","333","444","555"}; 
String result = messageFormat.format(args); 

El resultado es:

insert into 000 values ('111', '222', '333', 444) 

¿Es esto lo que necesita?

+1

Lo había intentado antes, pero no funcionaba. Algo fue arruinado con el proceso de construcción ... después de una limpieza completa -> reconstruir, ¡este método funcionó! *gemido*. ¡Gracias! –

+0

De nada :) – serg

0

Lo primero que me vino a la mente fue cambiar str1, str2, str3 para tener las comillas simples alrededor de ellos.

 
Object[] args = { str0, "'" + str1 + "'", "'" + str2 + "'", "'" + str3 + "'", str4 }; 

Luego, por supuesto, elimine las comillas simples de su cadena de consulta.

+0

Gracias. Esta es mi solución actual, pero preferiría algo un poco más rápido/más limpio. –

6

dentro de una cadena, un par de comillas simples se pueden utilizar para citar ningún carácter arbitrario, excepto comillas simples. Por ejemplo, la cadena de patrón "'{0}'" representa la cadena "{0}", no un FormatElement. Una sola cita debe estar representada por comillas dobles duplicadas '' en un String. Por ejemplo, cadena de patrón "'{''}'" se interpreta como una secuencia de '{ (inicio de cotización y una llave izquierda), '' (una comilla simple), y }' (una llave de la derecha y al final de citar), no'{' y '}' (entre comillas indicadas izquierda y derecha): representando la cadena "{'}", no"{}".

Desde: MessageFormat (Java Platform SE 8)

+0

Gracias. Lo leí en los documentos de Java pero estaba confundido (y no pude obtener lo que quería de él), aunque definitivamente hay una gran posibilidad de que lo estuviera haciendo mal. ¿Cuidado para elaborar? –

+1

Creo que la parte importante es: "Una sola cita en sí misma debe estar representada por comillas dobles duplicadas" en una cadena "- el resto solo explica cómo las comillas simples y las llaves se analizan en combinación. Toda una oración ... – wemu

2

un solo uso comillas triples:

MessageFormat messageFormat = "insert into {0} values ('''{1}''', '''{2}''', '''{3}''', '''{4}''')"; 
+1

Esto simplemente da como resultado '" insertar en values ​​('{1}', '{2}', '{3}', ) ''. Por lo tanto, ahora tiene las comillas simples, pero los valores del argumento aún no se están insertando. –

25

Disculpe si esto está fuera de lugar, pero parece que está intentando replicar el PreparedStatement que ya está en JDBC.

Si está intentando crear SQL para ejecutarse en una base de datos, le sugiero que mire en PreparedStatement, ya hace lo que está intentando hacer (con una sintaxis ligeramente diferente).

Disculpa si esto no es lo que estás haciendo, solo pensé en señalarlo.

+0

Yo tampoco sabía nada de esto, ¡gracias! –

Cuestiones relacionadas