Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java QueryDSL与Spring引导数据JPA的交集_Java_Spring Boot_Spring Data Jpa_Querydsl - Fatal编程技术网

Java QueryDSL与Spring引导数据JPA的交集

Java QueryDSL与Spring引导数据JPA的交集,java,spring-boot,spring-data-jpa,querydsl,Java,Spring Boot,Spring Data Jpa,Querydsl,我在SpringBoot、SpringDataJPA项目中使用QueryDSL。 对于名为test的表,我有以下模式: | id | key |值| |----|------|-------| |1 |测试|你好| |1 |测试|世界| |2 |测试|你好| |2|foo|bar| |3 |测试|您好| |3 |测试|世界| 现在我想在QueryDSL中编写以下SQL: 从测试中选择id,其中key='test'和value='hello' 横断 从测试中选择id,其中键='test'和值='

我在SpringBoot、SpringDataJPA项目中使用QueryDSL。 对于名为
test
的表,我有以下模式:

| id | key |值|
|----|------|-------|
|1 |测试|你好|
|1 |测试|世界|
|2 |测试|你好|
|2|foo|bar|
|3 |测试|您好|
|3 |测试|世界|
现在我想在QueryDSL中编写以下SQL:

从测试中选择id,其中key='test'和value='hello'
横断
从测试中选择id,其中键='test'和值='world'
这将为我提供所有ID,其中键是“test”,值是“hello”和“world”

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

JPAQueryFactory queryFactory=newjpaqueryfactory(em);//em是一个实体管理器
QTestEntity QTestEntity=QTestEntity.testEntity;
var q1=queryFactory.query().from(qTestEntity).select(qTestEntity.id).where(qTestEntity.key(“test”).和(qTestEntity.value.eq(“hello”);
var q2=queryFactory.query().from(qTestEntity).select(qTestEntity.id).where(qTestEntity.key(“test”)和(qTestEntity.value.eq(“world”);;
最后,我想检索与给定查询匹配的ID列表。通常,相交的数量可以是20或30左右,这取决于我要搜索的键/值对的数量

有人知道如何用QueryDSL做这样的事情吗

编辑:

现在假设以下模式,有两个表:
test
和“user”:

测试:
|用户ID |键|值|
|---------|------|-------|
|1 |测试|你好|
|1 |测试|世界|
|2 |测试|你好|
|2|foo|bar|
|3 |测试|您好|
|3 |测试|世界|
用户:
|id |名称|
|----|----------|
|1 |约翰|
|2 |安娜|
|3 |费利西塔|
相应的java类如下所示
TestEntity
有一个包含其所有属性的复合键

@实体
公共类测试{
@身份证
@列(name=“userId”,nullable=false)
私有字符串pubmedId;
@身份证
@列(name=“value”,nullable=false)
私有字符串值;
@身份证
@列(name=“key”,nullable=false)
私钥;
}
@实体
类用户{
@身份证
私有int-id;
私有字符串名称;
@元素集合
私有设置键值;
}

如何将
test
表映射到
User
类中的
keyValues
属性

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

如果它只能通过使用其所有属性来识别,那么它是一个@embedded,并且没有任何@Id属性

您可以将一个Embeddebles集合映射为另一个实体的@ElementCollection部分,该实体的id为主键。您案例中的id列不是可嵌入的属性,它只是主表的外键,因此您将其映射为@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;
}

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

如果它只能通过使用其所有属性来识别,那么它是一个@embedded,并且没有任何@Id属性

您可以将一个Embeddebles集合映射为另一个实体的@ElementCollection部分,该实体的id为主键。您案例中的id列不是可嵌入的属性,它只是主表的外键,因此您将其映射为@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;
}

在这种情况下,我可能只使用
表达式:

queryFactory
    .query()
    .from(qTestEntity) .select(qTestEntity.id)
    .where(qTestEntity.key("test").and(
        qTestEntity.value.eq("hello")
       .or(qTestEntity.value.eq("world")));
但是,您特别提到希望使用set操作。顺便说一下,我认为您希望执行
UNION
操作,而不是
insertest
操作,因为在给出的示例中,后者将是空的

JPA不支持ANSI SQL中定义的集合操作。然而,Blaze Persistence是一个与大多数JPA实现集成的扩展,它确实使用集合操作扩展了JPQL。我最近为Blaze持久性编写了一个QueryDSL扩展。使用该扩展,您可以执行以下操作:

List<Document> documents = new BlazeJPAQuery<Document>(entityManager, cbf)
    .union(
         select(document).from(document).where(document.id.eq(41L)),
         select(document).from(document).where(document.id.eq(42L))
    ).fetch();
List documents=new BlazeJPAQuery(entityManager,cbf)
.工会(
选择(文档).from(文档).where(document.id.eq(41L)),
选择(文档).from(文档).where(文档id.eq(42L))
).fetch();

有关集成和如何设置集成的更多信息,请访问

文档。在本例中,我可能只使用
表达式:

queryFactory
    .query()
    .from(qTestEntity) .select(qTestEntity.id)
    .where(qTestEntity.key("test").and(
        qTestEntity.value.eq("hello")
       .or(qTestEntity.value.eq("world")));
但是,您特别提到希望使用set操作。顺便说一下,我认为您希望执行
UNION
操作,而不是
insertest
操作,因为在给出的示例中,后者将是空的

JPA不支持ANSI SQL中定义的集合操作。然而,Blaze Persistence是一个与大多数JPA实现集成的扩展,它确实使用集合操作扩展了JPQL。我最近为Blaze持久性编写了一个QueryDSL扩展。使用该扩展,您可以执行以下操作:

List<Document> documents = new BlazeJPAQuery<Document>(entityManager, cbf)
    .union(
         select(document).from(document).where(document.id.eq(41L)),
         select(document).from(document).where(document.id.eq(42L))
    ).fetch();
List documents=new BlazeJPAQuery(entityManager,cbf)
.工会(
选择(文档).from(文档).where(document.id.eq(41L)),
选择(文档).from(文档).where(文档id.eq(42L))
).fetch();

有关集成以及如何设置集成的更多信息,请访问

获取文档。您确实是正确的。QTestEntity是另一个实体的一部分。有了你的建议,QueryDSL确实变得更加清晰了。我现在正在努力寻找一种方法,将
TestEntity
映射到
Users
类。我对我原来的帖子进行了编辑。我遇到的问题是,
TestEntity
有一个由所有