我目前正在努力处理一个我知道是可能的查询,但由于我在SQL查询方面的拙劣技能,我真的无法找到正确的句子.

我想找到某个区域的所有领土.每个分区包含多个区域,但一个区域可以属于一个分区.实体如下:

public class Territory {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    private String name;

    private Long owned_player;

    @OneToMany
    private List<Territory> neighbors;

    private int no_of_armies;

    public Territory(String name) {
        this.no_of_armies = 0;
        this.neighbors = new ArrayList<>();
        this.name = name;
        //this.owned_player = new Player(0);
        this.owned_player = null;
    }
@Entity
public class Zone {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    private String map;
    //private int control_value;
    @OneToMany
    private List<Territory> territories;

    public Zone(String name, String map) {
        this.territories = new ArrayList<>();
        this.name = name;
        this.map = map;
        //this.control_value = control_value;
    }

我必须插入查询的回购如下所示:

public interface TerritoryRepository extends JpaRepository<Territory,Long> {

    @Query("????")
    public List<Territory> findAllTerritoriesByZone(String zone);

}

我正在试图找到将返回所有属于亚洲的领土(中国、日本、台湾……)的查询或欧洲(西班牙、法国、德国……)例如

感谢您的帮助和关注!

推荐答案

您的示例中存在一些问题,一旦开始运行,就会出现问题,但现在我将重点讨论您特定问题的答案.

在您的示例中,区域和区域之间的关系是单向的.Zone#territories意味着如果你有一个区域,你可以导航到它的领土.但由于领土并没有区域的参考,你们不能穿越那个方向,这将是你们的问题的一个问题,因为这实际上就是你们要做的.

因此,你需要做的第一件事就是让这种关系具有双向性.

您可以通过在Territory类中添加对区域的引用来实现此目的:

    @ManyToOne
    @JoinColumn(name = "ZONE_ID")
    private Zone zone;

然后用mappedBy属性更新Zone#territories,以便JPA实现能够理解这两个字段相互引用.

    @OneToMany(mappedBy = "zone")
    private List<Territory> territories = new ArrayList<>();

这样,您现在可以从存储库中的某个区域引用该区域.在您的存储库中,我不清楚zone参数应该指什么-区域的名称?如果是,您可以使用此查询查找具有特定名称的分区的地区:

    // in TerritoryRepository 
    @Query("select t from Territory t join t.zone where t.zone.name = :zone")
    public List<Territory> findAllTerritoriesByZone(String zone);

也可以使用常规的派生查询来表达这一点,在这种情况下,您根本不需要指定@Query/JPQL:

    List<Territory> findAllByZoneName(String zone);

示例的其他问题:

  • Territory需要@Entity注释
  • Territory#neighbors表示为@OneToMany关系.这可能是一段@ManyToMany人的关系,因为你可以有很多邻居,每个邻居自己都有很多邻居.为了这个答案的其余部分,我把它注释掉了.
  • 您的TerritoryZone没有默认构造函数.JPA要求实体具有默认的公共/受保护构造函数,以便它可以反射地实例化它们.我重新添加了这些,以使示例生效.

Sql相关问答推荐

如何根据SQL中的列条件获取下一个时间戳?

PostgreSQL:获取每家店铺收入最高的员工

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

对任何(数组)使用LIKE?

UPDATE查询中的乐观锁

如何隐藏聚合JSON数组元素的键

使用多个嵌套数组查询JSON数据

WooCommerce产品的SQL查询:获取sku和产品标签

使用递归CTE在BigQuery中获取文件路径

使用多个WITH子查询的替代方法

在 SQL Server 中合并两个 XML 列

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

将一名成员金额分配给群组内的其他成员

SQL 按 id 运行总计并受条件限制(在窗口上)

SQL Server 查找存在于所有不同时期(或序列)中的条目

计算 PostgreSQL 中的平均会话长度

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

如何在 SQL Server 中参数化 Select top 'n'