【发布时间】:2015-11-10 01:28:14
【问题描述】:
我正在尝试使用 LazyDataModel 在 Primefaces 数据表中为任何实体实现通用过滤器系统,但在尝试搜索涉及一对多关系的字段时出现问题,因为它会生成错误的 SQL 查询,我的代码如下将跳过一些不相关的部分以使其尽可能简单:
实体是客户端和故障:
@Entity
@Table(name = "ges_fault")
public class Fault extends Item implements Serializable, ItemIf{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "client_id", nullable = true)
private Client client;
// Getters and setters
客户端类:
@Entity
@Table(name="ges_client")
public class Client extends Item implements Serializable, ItemIf {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@OneToMany(cascade = CascadeType.ALL,mappedBy="client", fetch = FetchType.LAZY)
private List<Fault> faults;
// Getters and setters
为了抽象问题,最终的条件查询如下所示:
CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Fault> c = qb.createQuery(Fault.class);
Root<Fault> root = c.from(Fault.class);
c.select(root);
List<Predicate> predicates = new ArrayList<Predicate>();
Expression<String> exp = root.get("client");
predicates.add(qb.like(exp,"%" + 1 + "%"));
c.where(predicates.toArray(new Predicate[]{}));
List<Fault>result = q.getResultList();
return result;
我得到的错误是:
内部异常: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在 'LIKE '%1%' AND 附近使用正确的语法 (t0.ID = t1.client_id)) LIMIT 0, 12' at line 1
错误代码:1064 调用:
SELECT t1.ID AS a1, t1.NOMBRE AS a8, t1.client_id AS a9 FROM ges_client t0, ges_fault t1 WHERE ( LIKE ? AND (t0.ID = t1.client_id)) 限制 ?, ? bind => [3个参数绑定]查询: ReadAllQuery(referenceClass=Falta sql="SELECT t1.ID AS a1, t1.NOMBRE AS a8, t1.client_id AS a9 FROM ges_client t0, ges_falta t1 WHERE ( 喜欢 ? AND (t0.ID = t1.client_id)) 限制 ?, ?") 在 org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) 在 org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:682) 在 org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) 在 org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2002) 在 org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570) 在 org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
因为我想做的事情我不能使用这种查询:
Expression<String> exp = root.get(Fault_.client);
所以这不是一个可能的解决方案。
我希望有人可以帮助我。
【问题讨论】:
-
所以 EclipseLink 创建了一些不正确的 SQL。尝试不同的 JPA 实现,看看会产生什么
-
我可以在 glassfish 服务器上使用什么?
-
感谢您的评论,但通常更改 JPA 的实现并不像添加一些库那么简单,当涉及到某个规模的项目并希望花一两天时间来更改它,并且可能解决不了问题。
-
“可能无法解决” ...您可以通过将所涉及的类+标准代码拆分为一个小的自包含测试并在容器外运行它来轻松验证这一点。我的代码中有很多标准示例,就像您在那里的那样,并且在使用不同的 JPA 提供程序时不会出现此类错误
-
请删除所有根本不相关的不必要代码:facelets、primefaces、jsf 和托管 bean 与您的问题无关,仅与 JPA 标准查询有关。
标签: java jpa eclipselink criteria-api