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

在数据库中不使用JPA创建表,可以使用@MappdSuperclass而不是@Entity吗?

宰父志新
2023-03-14

为了解释这个问题,我需要参考POSTGRES中的一个函数:

SELECT * from pgr_dijkstra('SELECT gid AS id, source, target, length AS cost FROM ways', 11111, 22222);

"Pgr_dijkstra"是POSTGIS的函数,而不是表。它返回源(11111)和目标(2222)之间的最短路径。结果是6列:“seq、path_seq、节点、边缘、成本和agg_cost”。

因为“pgr_dijkstra”是一个函数,所以我不能在代码中创建一个类并用@Entity注释它,还可以将@Id添加到“seq”中,并创建其他5个字段(path_seq、node、edge、cost和agg_cost)。这将在数据库中创建一个新表。经过大量研究,我找到了一个我认为远不理想的解决方案,这不是好的实践。注意:我使用的是SpringBootJava。“源”和“目标”的值不会固定,用户将通过浏览器发送,我将其固定,只是为了更快地测试这部分。

POJO类:

public class Dijkstra3 {

public Integer seq;
public Integer path_seq;
public BigInteger node;
public BigInteger edge;
public double cost;
public double agg_cost;


public Dijkstra3(Integer seq, Integer path_seq, BigInteger node, BigInteger edge, double cost, double agg_cost) {
super();
this.seq = seq;
this.path_seq = path_seq;
this.node = node;
this.edge = edge;
this.cost = cost;
this.agg_cost = agg_cost;
}

//GETTERS ...

}

使用@SqlResultSetMapping和@namednaviquery抽象类。@SQLResultsMapping注释正在将结果映射到Dijkstra3。同学们,这是我的POJO@NamedNativeQuery是我的查询,我将使用它,我指向“DijkstraMapping”映射。我用@MappedSuperclass注释了这个类,如果我不这样做,我将不得不用@Entity注释,并在数据库中创建一个新表。

@SqlResultSetMapping(
name = "DijkstraMapping",
classes = {
    @ConstructorResult(
        columns = {
                @ColumnResult(name="seq", type=Integer.class),
                @ColumnResult(name="path_seq", type=Integer.class),
                @ColumnResult(name="node", type=BigInteger.class),
                @ColumnResult(name="edge", type=BigInteger.class),
                @ColumnResult(name="cost", type=Double.class),
                @ColumnResult(name="agg_cost", type=Double.class)
        },
        targetClass = Dijkstra3.class
    )
}
)

@NamedNativeQueries({
@NamedNativeQuery(
    name = "GetDijkstra",
    query = "SELECT * from pgr_dijkstra('SELECT gid AS id, source, target, length AS cost FROM ways', 11111, 22222)",
    resultSetMapping = "DijkstraMapping"
)
}) 

@MappedSuperclass
public abstract class DijkstraSqlMap{


}

存储库

@Repository
public class TestRepository2 {      

@PersistenceContext
EntityManager em;

public List<Dijkstra3> callDijkstra(){

TypedQuery<Dijkstra3> query = em.createNamedQuery("GetDijkstra", Dijkstra3.class);
List<Dijkstra3> lista = query.getResultList();

return lista;
}
}

在我的控制器或服务上:

@Autowired
TestRepository2 testeRepository2;

...

List<Dijkstra3> callHelloWorld = testeRepository2.callDijkstra();

...     

它工作。在研究和测试了我所发现的一切之后,这是我发现的使用JPA获取查询结果的最佳方式,将数据传递给对象/POJO,并且主要不要在数据库中创建新表,因为“pgr_dijkstra”是一个函数并且它的返回数据不代表表。

问题是:是否正确的注解DijkstraSqlMap类与@MappadSuperclass,这样你就不需要注释与@Entity?有没有其他更好的方法来获取数据库中的查询结果并将其传递给对象/POJO,而无需在数据库中创建新表?我感谢你的时间和帮助。

共有1个答案

司空坚
2023-03-14

为此,可以使用Hibernate注释@Subselect,并将其映射为普通实体。

@Entity
@Subselect("SELECT * from pgr_dijkstra('SELECT gid AS id, source, target, length AS cost FROM ways', 11111, 22222)")
public class Dijkstra3 {
  public Integer seq;
  public Integer path_seq;
  public BigInteger node;
  public BigInteger edge;
  public double cost;
  public double agg_cost;
}
 类似资料:
  • 问题内容: 使用H2, 如果数据库尚不存在,则创建数据库。 但是,在Postgres中,不会创建不存在的数据库,因此会引发异常,例如“ DB不存在”。有没有一种方法可以配置Postgres按需创建不存在的数据库? 以下配置文件可用于重现该问题: 使用H2可以正常工作: 使用Postgres失败 问题答案: 该工具只能为现有架构创建表,而不能为您创建架构。在运行该工具之前,数据库必须存在。这是因为数

  • 问题内容: 我想创建一个使用PDO与MySQL交互的类。我可以使用PDO创建一个新的MySQL表吗? 问题答案: 是的你可以。 该部分是PDO构造函数的第一个参数,不必具有数据库名称。您可以简单地使用。然后,如果您具有适当的特权,则可以使用常规SQL命令创建数据库和用户等。 以下是install.php的示例,它以root用户身份登录,创建一个数据库,一个用户,并向用户授予对新创建的数据库的所有特

  • 所以我在使用DerbyDB,并建立了一些实体。我有一个,它被用作某些实体的超类()。更具体地说,我有一个超类和3个子类,即、和。现在我有了一个不同的实体,比如说,它应该引用(作为其字段之一)它的所有者。所以我创建了一个名为的字段。我得到的错误是: 有变通办法吗?

  • 我正在尝试代码优先的方法来使用Spring、Boot和Hibernate创建数据库。 但是,我现在还做不到。 这是我的控制器

  • 问题内容: 我正在使用,并且正在尝试运行一个简单的应用程序,尤其是运行在page中描述的应用程序。我的hibernate.cfg.xml文件是: 我(使用maven时)是: 我在链接中使用它: 但是,不可能获得应用程序的工作,即在数据库中hibernate创建表并插入值。无论尝试如何,我总是会收到相同的错误: 在线上的“关系部门不存在”: 我也没有完全相同的错误尝试过。为了抢占某些读者,请不要在数

  • 虽然我可以在其他项目中创建表,但这个项目不是从实体类创建表。我在使用eclipse的spring boot jpa中有以下实体类: 存储库类如下: 下面是属性文件: 但在没有任何错误地运行项目之后,我看不到在mySql工作台中创建的表。我试了很多次都没有成功。如果你找到解决办法,请告诉我。干杯