如何在Sql中将单个子字符串与String相匹配?

时间:2016-09-16 09:55:39

标签: java sql

我正在使用我的主类中的实体管理器调用命名查询,如下所示

$('.dateStart[value="0"]').addClass('selected');
$('.dateStart[val="0"]').addClass('selected');
$('.dateStart[attr-val="0"]').addClass('selected');

命名查询如下

public  void openDialogInvite(Activity activity)
{
    String appLinkUrl, previewImageUrl;

    appLinkUrl = "url";
    previewImageUrl = "img";

    if (AppInviteDialog.canShow())
    {
        AppInviteContent content = new AppInviteContent.Builder()
                .setApplinkUrl(appLinkUrl)
                .setPreviewImageUrl(previewImageUrl)
                .build();
        CallbackManager sCallbackManager = CallbackManager.Factory.create();
        AppInviteDialog appInviteDialog = new AppInviteDialog(activity);
        appInviteDialog.registerCallback(sCallbackManager, new FacebookCallback<AppInviteDialog.Result>()
        {

            @Override
            public void onSuccess(AppInviteDialog.Result result) {
                Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onCancel() {
                Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onError(FacebookException error) {
                Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
            }
        });

        appInviteDialog.show(content);
    }
}

我传递包含字符串值的NAMES(&#39; A&#39;,&#39; B&#39;&#39; C&#39;)

现在我遇到的问题是表中的sc.name列包含单个值为&#34; A&#34;,&#34; B&#34;,&#34; C&# 34;但是我将查询中的列sc.name作为整数与NAMES变量进行比较。它返回了结果列表。

如何将单个子字符串与String匹配?

3 个答案:

答案 0 :(得分:1)

JDBC对于SQL ARRAY有一个Array类,对于某些用法,例如createArrayOf

Array array = connection.createArrayOf("VARCHAR", new Object[] {"A", "B", "C" });
preparedStatement.setArray("name", array);

答案 1 :(得分:1)

List(或任何Collection)传递给setParameter方法。

query.setParameter("name",list)

hibernate专门做了一个检查集合的实例

 public TypedQuery<X> setParameter(String name, Object value) {
    try {
      if(value instanceof Collection) {
        this.query.setParameterList(name, (Collection)value);
      } else {
        this.query.setParameter(name, value);
      }

      this.registerParameterBinding(this.getParameter(name), value);
      return this;
    } catch (QueryParameterException var4) {
      throw new IllegalArgumentException(var4);
    } catch (HibernateException var5) {
      throw this.getEntityManager().convert(var5);
    }
  }

其他JPA实现可能具有相同的行为

答案 2 :(得分:0)

如果你坚持NAMES是字符串类型&#34; A,B,C&#34;,我看到2个选项: 1)每次都建立sql,没有参数

query = "SELECT sc FROM sampleTable sc  where sc.name IN (" + NAMES + ")"

如果NAMES来自用户输入,则受sql注入。

2)sql注入安全选项带参数但性能可能较慢,优化器不能使用索引

query = "SELECT sc FROM sampleTable sc where ',' || :name || ',' like '%,' || sc.name || ',%'"