Java多连接查询

标签 java spring spring-boot jpa

我正在尝试使用 Spring Boot 在 Java 中创建 REST 服务。

我有 2 个表主题类(class),我想从检索NAMEDESCRIPTION来自类(class)的主题价格。 这两个表之间的连接是通过类(class)中的TOPIC_ID建立的。

结果必须是 JSON。

[
{
"id": "course1",
"name": "name course1",
"description": "course1"
},
{
"id": "course2",
"name": "course2 name",
"description": "course2"
},
{
"id": "course3",
"name": "course3 name",
"description": "course3"
}
]

查询如下。 我知道使用 DTO 和 JPA 是可能的,但我需要为简单的数据库查询编写大量代码。

谢谢。

package com.example.course;
import com.example.topic.Topic;
import javax.persistence.*;
@Entity
@Table(name = "topic", schema = "topic")
public class Topic {
    @Id
    private String id;
    private String name;
    private String description;

    public Topic() {

    }

    public Topic(String id, String name, String description) {
        this.id = id;
        this.name = name;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

package com.example.topic;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "course", schema = "topic")
public class Course {
    @Id
    @Column(name = "ID")
    private String id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "DESCRIPTION")
    private String description;
    @Column(name="PRICE")
    private Integer price;

    @ManyToOne
    @JoinColumn(name="TOPIC_ID", nullable=false)
    private Topic topic;

    public Course() {
    }

    public Course(String id, String name, String description, String topicId) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.topic = new Topic(topicId, "", "");
    }

    public String getDescription() {
        return description;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Topic getTopic() {
        return topic;
    }

    public void setTopic(Topic topic) {
        this.topic = topic;
    }

    public void setPrice(Integer price) { this.price = price; }

    public Integer getPrice() { return price; }
}

package com.example.dto;
public class TopicDescDTO {
    private String id;
    private String name;
    private String description;

    public TopicDescDTO(String id, String name, String description) {
        this.id = id;
        this.name = name;
        this.description = description;
    }

    public TopicDescDTO() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

select t.name, t.description, c.price as course_price
from topic.course c 
inner join topic.topic t on t.id = c.topic_id

最佳答案

利用 Spring Data JPA 提供的投影接口(interface):

public interface TopicDescDTO{

    Integer getPrice();
    String getName();
    String getDescription();

}

然后只需在您的存储库之一中找到适当的方法即可:

@Query(select t.name, t.description, c.price
       from Course c 
         inner join c.topic t)
List<TopicDescDTO> getTopicDescs();

Spring 将为您完成映射。

关于Java多连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57425005/

相关文章:

java - Richfaces 列过滤器 : How to fire an event on intro key

java - 在签名的 jar 中使用 Java 配置

java - Eclipse、Maven 和 Spring Boot 实时加载

java - Spring JPA 数据 : Custom Generic Repositories and Services: UnsatisfiedDependencyException

spring - 如何解决错误: Spring 退出值非零为1?

java - 检查 key 是否在 map 中 - 一种方法有效,另一种方法无效

jvm - java编译时错误,由于从jdk7降级到jdk6

Java 7 传递方法作为通用 SQL 死锁检查的参数

java - 将 Spring boot war 部署到 Tomcat 8

java - Spring 安全 - 自定义 ExceptionTranslationFilter