[英]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.