JPQL 查询在测试中工作,而不是在生产中

Posted

技术标签:

【中文标题】JPQL 查询在测试中工作,而不是在生产中【英文标题】:JPQL Query working in testing, not in production 【发布时间】:2013-12-05 17:37:50 【问题描述】:

我有两个由 ManyToMany 关联的实体,我想通过命名查询来选择它们。这适用于我的测试(设置了 H2 DB)并在运行时引发异常(设置了 postgresql)。除了 H2 和 PG,我很难找到测试和生产之间的差异。

实体和查询看起来像这样(缩写):

@Entity(name = "Enrichment")
@Table(name = "mh_Enrichment")
NamedQueries(
    @NamedQuery(name = "findByLink",
    query = "SELECT e FROM Enrichment e INNER JOIN e.links l WHERE l.link in (:links)") )
public class EnrichmentImpl  
  @Id
  @Column(name = "enrichmentId")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  @ManyToMany
  @JoinTable(name = "mh_EnrichmentLinks", joinColumns =  @JoinColumn(name = "EnrichmentId",
          referencedColumnName = "enrichmentId") , inverseJoinColumns =  @JoinColumn(name = "Link",
          referencedColumnName = "link") )
  private List<Link> links;


@Entity(name = "Link")
@Table(name = "mh_enrichment_link")
public class LinksImpl 
  @Id
  @Column(name = "link", length = 1024)
  private String link;
  

在生产中使用字符串值运行查询时,我得到:

Internal Exception: org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = bigint
Hinweis: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 215
Error Code: 0
Call: SELECT t1.enrichmentId FROM mh_enrichment_link t0, mh_EnrichmentLinks t2, mh_Enrichment t1 WHERE ((t0.link IN (?)) AND ((t2.EnrichmentId = t1.enrichmentId) AND (t0.link = t2.Link)))

任何想法有什么问题吗?这是查询,不是吗? 该查询应该检索与给定链接相关的丰富列表。

更新 #1 根据要求:数据库中的表如下所示:

对于实体Link

CREATE TABLE mh_enrichment_link
(
  link character varying(1024) NOT NULL,
  CONSTRAINT mh_enrichment_link_pkey PRIMARY KEY (link)
)

对于实体Enrichment

CREATE TABLE mh_enrichment
(
  enrichmentid bigint NOT NULL,
  CONSTRAINT mh_enrichment_pkey PRIMARY KEY (enrichmentid)
)

对于关系(见答案,这是出错的地方)

CREATE TABLE mh_enrichmentlinks
(
  link character varying(1024) NOT NULL,
  CONSTRAINT mh_enrichment_link_pkey PRIMARY KEY (link)
)

【问题讨论】:

看起来连接表中的列类型与它们在链接和扩充中引用的列的类型不匹配。检查您的表定义。 我做到了。但据我了解,它们是正确的。运行测试证实了这一点。表Links 列链接无论如何都是字符类型。 为什么不给我们看一下每个表的定义?还有,这个LinksImpl实体是什么,Link实体的代码在哪里? 我很抱歉造成混乱。类LinksImpl 实现Link 实体(表mh_enrichment_link)。代码在帖子中。此外,我将使用我在数据库中看到的三个表来更新帖子。 发布您的真实代码和您的真实表定义。 LinksImpl 没有实现 Link,所以代码是错误的。您发布了同一张表的两个不同定义。只提供不正确的信息就发现问题是浪费时间。 【参考方案1】:

已通过删除所有相关表并让 JPA 重新生成它们来解决此问题。表定义与实体定义不匹配。 这也是测试有效而生产无效的很明显的原因。在测试中,表是在运行时生成的,在生产中它们已经存在(具有过时的定义)。 旁注:查询是正确的,并且做了它应该做的。

【讨论】:

以上是关于JPQL 查询在测试中工作,而不是在生产中的主要内容,如果未能解决你的问题,请参考以下文章

Braintree Paypal 在沙盒中工作,但不是生产

ApnsPHP:在开发中工作但不在生产中的推送通知

使用 JPQL 连接不相关的实体在休眠 5.3.2 中无法在 Spring 数据中工作

ActionCable 不再在生产环境中工作

NextJS:TailwindCSS 无法在生产环境中工作

Angular 2 生产构建错误。在开发中工作正常