当前位置: 首页 > 知识库问答 >
问题:

QueryDSL与Spring Boot数据JPA的交集

夏侯昆琦
2023-03-14
| id | key  | value |
|----|------|-------|
| 1  | test | hello |
| 1  | test | world |
| 2  | test | hello |
| 2  | foo  | bar   |
| 3  | test | hello |
| 3  | test | world |
select id from test where key = 'test' and value = 'hello'
INTERSECT
select id from test where key = 'test' and value = 'world'

我还没有找到在QueryDSL中声明这种SQL的任何方法。我能够编写两个select语句,但是我仍然无法将它们与intersect结合起来。

JPAQueryFactory queryFactory = new JPAQueryFactory(em); // em is an EntityManager

QTestEntity qTestEntity = QTestEntity.testEntity;

var q1 = queryFactory.query().from(qTestEntity).select(qTestEntity.id).where(qTestEntity.key("test").and(qTestEntity.value.eq("hello")));
var q2 = queryFactory.query().from(qTestEntity).select(qTestEntity.id).where(qTestEntity.key("test").and(qTestEntity.value.eq("world")));;

最后,我想检索一个与给定查询匹配的ID列表。通常,相交的数量可以是20或30左右,这取决于我要搜索的键/值对的数量。

有没有人知道如何使用QueryDSL执行类似的操作?

test:

| userId  | key  | value |
|---------|------|-------|
| 1       | test | hello |
| 1       | test | world |
| 2       | test | hello |
| 2       | foo  | bar   |
| 3       | test | hello |
| 3       | test | world |

user:

| id | name     |
|----|----------|
| 1  | John     |
| 2  | Anna     |
| 3  | Felicita |
@Entity
public class TestEntity {
    @Id
    @Column(name = "userId", nullable = false)
    private String pubmedId;

    @Id
    @Column(name = "value", nullable = false)
    private String value;

    @Id
    @Column(name = "key", nullable = false)
    private String key;
}

@Entity
class User {
  @Id 
  private int id;

  private String name;

  @ElementCollection
  private Set<TestEntity> keyValues;
}

共有1个答案

能逸清
2023-03-14

您的TestEntity实际上不是一个实体,因为它的id不是主键,而是用户表的外键。

如果它只能通过使用它的所有属性来识别,那么它就是一个@embeddable,没有任何@id属性。

您可以将Embeddable的集合映射为另一个实体的@ElementCollection部分,该实体以id作为主键。在您的示例中,id列不是Embeddable的属性,它只是主表的外键,因此您将其映射为@JoinColumn:

@Embeddable
public class TestEmbeddable {

    @Column(name = "value", nullable = false)
    private String value;

    @Column(name = "key", nullable = false)
    private String key;
}

@Entity
class User {
  @Id 
  private int id;
  @ElementCollection
  @CollectionTable(
     name="test",
     joinColumns=@JoinColumn(name="id")
  )
  private Set<TestEmbeddable> keyValues;
}
user.keyValues.any().in(new TestEmbeddable("test", "hello"))
  .and(user.keyValues.keyValues.any().in(new TestEmbeddable("test", "world"))
 类似资料:
  • 我是Spring data JPA的新手,正在尝试了解如何最好地将其与QueryDSL一起使用。如果没有QueryDSL,我就可以用@Query注释在SpringData接口中创建任何查询。 为了获得使用QueryDSL的相同体验,根据我所看到的,我需要创建我自己的自定义存储库实现并让我的repo接口扩展我的自定义实现接口,或者将我的所有QueryDSL查询放在包装我的repo的服务层。 在第一种

  • 我正在尝试从mysql数据库中检索今天的记录。 和控制器代码: 我希望通过使用findByDate(...)获得今天的记录方法,但似乎不起作用。在查看MysqlWorkbench的数据时,我还注意到一个小问题:日期似乎提前了2小时(例如:现在是11:57,但在mysql workbench软件中显示的是9:57,当我查询服务器时间时,显示的是不正确的tme……)我其实不关心小时/分钟/秒,我只想检

  • 我使用的是Querydsl 2.9、Spring Data JPA 1.3.0和Hibernate JPA 2 API 1.0版。我试图在两个表和之间进行简单的连接,连接到列。由于某些原因,Hibernate执行的查询中总是有一个额外的。这些表格如下所示: 但是,实际运行的查询是这样的: 请注意结尾处额外的。我意识到,如果在上执行可以得到正确的结果,但我不希望在不需要的情况下增加的额外开销。我尝试

  • 作为一个爱好项目,我目前正在开发一个全堆栈的web应用程序。 我的技术堆栈是: MySql数据库 我已经对数据库进行了建模,并为数据库中的所有表创建了jpa实体。数据模型包括一些双向关系(多对多关系)。然后,我开始为前端创建一些APIendpoint进行交互,但我在决定如何序列化数据并将其发送到前端时遇到了一些问题。 在大多数教程和示例中,与数据库对象直接相似的对象被序列化,然后发送到前端。但我不

  • 我们有Spring Data JPA的功能,我们在其中使用querydsl,如下所示 这是我的实体: 这是我的知识库: 通过上面的代码,我能够实现QueryDSL功能,并根据实体中的任何字段查询实体。 现在,当我们从sql server迁移到Neo4j时,这里是我的实体 这是我的知识库 这些是我的Neo4j应用程序的一些版本和属性 在构建了使用Neo4J的应用程序后,它没有生成QCarEntity

  • null 类似于REST查询DSL 用于全文和结构化搜索的查询语言