【问题标题】:Can I use the conditional ternary operator into a string concatenation?我可以在字符串连接中使用条件三元运算符吗?
【发布时间】:2016-10-27 04:12:05
【问题描述】:

我有以下疑问:我能否以某种方式将条件三元运算符用于字符串连接?

我正在尝试做这样的事情:

String sql = "insert into TirConsolidatoPolizzaFondo "
                       + "(Polizzaid, FondoID, isQuadraturaOk, ReteVendita,  CodiceConferimento, PercentualeRendimentoDaInizioGestione, "
                       + "DataInizioGestione, PercentualeRendimentoDaInizioAnno, DataInizioAnno, PercentualeRendimentoDaInizioTrimestre, "
                       + "DataInizioTrimestre, DataCalcoloBF, ValoreNavBF, DataRiferimentoNavBF, ControvaloreFinaleBF, ValoreNavPUC, "
                       + "DataRiferimentoNavPUC, ControvaloreFinalePUC, NumeroQuotePUC, DeltaControvaloreFinale, TIMESTAMP, "
                       + "DataValutaUltimaOperazione, MsgPercentualeRendimentoDaInizioAnno, MsgPercentualeRendimentoDaInizioGestione, "
                       + "MsgPercentualeRendimentoDaInizioTrimestre, isTirAnomalo, CodiceLineaBF) "
                       + "values"
                       + "(" + 



                       qsTirPF.getPolizzaid() != null ?  qsTirPF.getPolizzaid() : "null";

这意味着在第一个字符串主干上,我想连接由以下评估的值:

qsTirPF.getPolizzaid() != null ?  qsTirPF.getPolizzaid() : "null";

但是 Eclipse 给我签名这个错误:

Type mismatch: cannot convert from Object&Comparable<?>&Serializable to String

为什么?怎么了?我该如何解决这个问题?

【问题讨论】:

  • 你试过在三元表达式周围加上括号吗? ... + (qsTirPF.getPolizzaid() != null ? qsTirPF.getPolizzaid() : "null");
  • 您还确定要使用字符串连接来提供 SQL 查询参数吗?通常避免使用 Bobby Tables 的首选方法是使用 PreparedStatement 并使用其setXYZ 方法。
  • 请注意,这是 2016 年;帮自己一个忙,使用准备好的语句来避免潜在的 SQL 注入。
  • 无论如何我无法重现这个确切的问题。您能否发布正确的SSCCE / minimal reproducible example,这将允许我们简单地将您的示例复制到我们的 IDE 并得到相同的错误?

标签: java conditional ternary-operator


【解决方案1】:

首先你应该把你的三元条件放在括号内:

(qsTirPF.getPolizzaid() != null ?  qsTirPF.getPolizzaid() : "null")

此外,您应该验证 qsTirPF.getPolizzaid() 正在返回一个字符串

【讨论】:

  • qsTirPF.getPolizzaid() 可以是他想要的任何东西。如果它是一个对象(不是原语),则 toString() 将被调用。
  • 是的。我只是告诉他验证它返回的是什么。如果他覆盖它,他可能会在 toString() 中出错。但通常他只需要括号
【解决方案2】:

你需要括号:

String sql = "insert into TirConsolidatoPolizzaFondo "
    + "(Polizzaid, FondoID, isQuadraturaOk, ReteVendita,  CodiceConferimento, PercentualeRendimentoDaInizioGestione, "
    + "DataInizioGestione, PercentualeRendimentoDaInizioAnno, DataInizioAnno, PercentualeRendimentoDaInizioTrimestre, "
    + "DataInizioTrimestre, DataCalcoloBF, ValoreNavBF, DataRiferimentoNavBF, ControvaloreFinaleBF, ValoreNavPUC, "
    + "DataRiferimentoNavPUC, ControvaloreFinalePUC, NumeroQuotePUC, DeltaControvaloreFinale, TIMESTAMP, "
    + "DataValutaUltimaOperazione, MsgPercentualeRendimentoDaInizioAnno, MsgPercentualeRendimentoDaInizioGestione, "
    + "MsgPercentualeRendimentoDaInizioTrimestre, isTirAnomalo, CodiceLineaBF) "
    + "values"
    + "(" + (qsTirPF.getPolizzaid() != null ?  qsTirPF.getPolizzaid() : "null");

【讨论】:

    【解决方案3】:

    您可以使用括号告诉编译器您要与条件三元运算符的结果连接:

    String sql = "insert into TirConsolidatoPolizzaFondo "
                       + ...
                       + ((getPolizzaid() != null)?  qsTirPF.getPolizzaid() : "null");
    

    这应该可行。

    PS:您可以使用 StringBuilder 来构建查询,而不是使用 + 号。效率更高。

    【讨论】:

    • 无论如何,Java 编译器都会使用 StringBuilder 将其转换为代码。如果你反汇编类文件,你会看到。
    • 当所有字符串都是静态的时候就是这种情况。我不能确定,当有条件连接时,编译器会优化这段代码。
    • 这不是真的,例如声明:"bla bla bla" + this.myList == null ? “空”:this.myList.size();是一个有效的句子,没有编译错误
    猜你喜欢
    • 2019-01-06
    • 2017-12-04
    • 2016-11-28
    • 2022-01-02
    • 2015-06-09
    • 2023-02-16
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多