2013-07-18 99 views
0

我得到我的查询此错误消息..我使用的OpenJPA和SQL Server为我的数据库中指定...无效转义字符“\”在LIKE谓词

这是我的查询:

public static List<ProcesosGeneralEntity> getALLbyProductor(String productor){ 
      Query q = entityManager.createQuery("select a from ProcesosGeneralEntity a where a.productor like :productor "); 
      q.setParameter("productor", '%'+productor+'%'); 
      List<ProcesosGeneralEntity>resultado=q.getResultList(); 
      List<ProcesosGeneralEntity>result2=new ArrayList<ProcesosGeneralEntity>(resultado); 
      return result2; 

     } 
+0

这听起来像OpenJPA的不正确地转义产品线,作为一个来源,我发现指出, Oracle数据库的转义字符是'\',因此为了避免引用'\'',并且转义反斜杠'\\'。而在SQL Server中,单引号的转义字符是另一个引号,如''''中的。所以听起来好像你有一个'productor'字符串,它包含一个'\',该OpenJPA正在转义为'\\'。解决方案可能是您需要指定您的'openjpa.jdbc.DBDictionary'配置设置为'sqlserver'。 –

回答

1

为防万一我上面的评论是正确的,我提交此作为暂定或可能的答案。

不同的数据库软件的行为稍有不同,该ANSI SQL Standard不包括SQL的所有行为怪癖,所以东西像字符串转义字符实现之间有所不同。在SQL Server中,使用另一个引号标记来转义引号,因此要打印字符串“Alice's dog”,需要在SQL中使用字符串'Alice''s dog'。在Oracle数据库中,转义字符是反斜杠,因此要打印相同的字符串,则使用'Alice\'s dog'。转义字符本身需要能够打印,因此在Oracle数据库中,要打印字符串“R2 \ D2”,需要输入字符串'R2\\D2'

您有这个问题似乎是它认为它正在与Oracle数据库,并因此拖欠后者的行为,并用\\报价单\,而不是离开它是。 SQL Server然后在这个选项或某些方面有一个呃逆。老实说,我不确定它为什么抛弃它。

无论如何,根据OpenJPA手册的4. Database Support - Chapter 4. JDBC部分,您需要指定正确的DBDictionary。 DBDictionary指定了在哪些情况下使用哪些转义字符等设置,以及支持的所有数据库系统中不统一的其他非标准选项。

的解决方案似乎是为您的软件配置文件中,你必须指定类似:

<property name="openjpa.jdbc.DBDictionary" value="sqlserver"/>

+1

你是对的,谢谢!我有字典设定为“MySQL的”我将其变更为: <属性名=“openjpa.jdbc.DBDictionary”值=“org.apache.openjpa.jdbc.sql.SQLServerDictionary” /> 现在我不得到错误信息:)! – user2018726