繁体   English   中英

JPA SQL查询(JPQL)中的字符串搜索运行时错误

[英]String search runtime error in JPA SQL query (JPQL)

尝试通过JPA从数据库中检索表并将其填充到Table SWT小部件( org.eclipse.swt.widgets.Table )时,执行以下Java代码时遇到转换错误:

String SQL = String.format("select t.id, t.one, t.two from Test t where t.one like '%%s%' order by t.id",one); //variable one is defined as a parameter of the method (whole method not included here for simplicity)

//this is the code that uses the SQL variable above
EntityManager connection = DB.Connection().createEntityManager(); //the EntityManagerFactory
TypedQuery<Object[]> query = connection.createQuery(SQL, Object[].class); /*gives the same as cast (TypedQuery<Object[]>) */
List<Object[]> tablelist = query.getResultList();
connection.close();

SWTtable.removeAll(); //clears all the elements in the table

for (Object[] row : tablelist) {
    final TableItem item = new TableItem(SWTtable, SWT.None);
    item.setData(row[0]);
    item.setText(0, row[1].toString());
}

错误java.util.UnknownFormatConversionException: Conversion = '''运行时java.util.UnknownFormatConversionException: Conversion = '''String SQL = String.format("select t.id, t.one, t.two from Test p where p.one like '%%s%' order by p.id",one);

问题在String SQL变量中似乎是'%%s%' 我需要保留'%%s%' ,以搜索通过上述查询选择的全部或其中一条记录。

  • '%%' -返回所有记录,但没有String参数
  • '%s' s'-如果SQL查询的语句正确,则给出特定记录

其他所有问题都引起了问题,字符串'%% s%'不是我写的,但是我需要保留它或通过保持相同的结果来对其进行更改。 我想要的结果是给出所有记录,但是在接收到String参数时返回该特定记录。

这里可能存在的问题超出了我的JPA知识范围。

我刚刚检查了TypedQuery API,您可以TypedQuery设置参数。

TypedQuery<Object[]> query = connection.createQuery("select t.id, t.one, t.two from Test t where t.one like :one order by t.id", Object[].class);
query.setParamter("one", "%" + s + "%");
List<Object[]> tablelist = query.getResultList();

更新:

好像这两个条件似乎是分开的,就像其他答案所建议的那样,您可以通过生成查询来完成

StringBuilder query = new StringBuilder("select t.id, t.one, t.two from Test t "); 
if (StringUtils.isNotEmpty(s)) { 
    query.append(" where t.one like :one "); 
} 
query.append(" order by t.id");
TypedQuery<Object[]> query = connection.createQuery(query.toString());

我个人将进行这两个查询,它将表现更好。 像这样:

public List<Object[]> collectOne( String param ) {
    TypedQuery<Object[]> query = connection.createQuery("select t.id, t.one, t.two from Test t where t.one like :one order by t.id", Object[].class);
    query.setParamter("one", "%" + param + "%");
    return query.getResultList();
}

public List<Object[]> collectAll() {
    TypedQuery<Object[]> query = connection.createQuery("select t.id, t.one, t.two from Test t order by t.id", Object[].class);
    return query.getResultList();
}

然后,您始终可以拥有可能带有或不带有参数的怪异方法:

public List<Object[]> collectOneOrAll( String param ) {
    if ( param == null || param.isEmpty() )
        return collectAll();

    return collectOne( param );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM