Does JPA support mapping to sql views?

前端 未结 3 707
野趣味
野趣味 2020-12-04 17:56

I\'m currently using Eclipselink, but I know now days most JPA implementations have been pretty standardized. Is there a native way to map a JPA entity to a view? I am not l

相关标签:
3条回答
  • 2020-12-04 18:25

    In my view I have a "unique" id, so I mapped it as the Entity id. It works very well:

    @Entity
    @Table(name="table")
    @NamedQuery(name="Table.findAll", query="SELECT n FROM Table n")
    public class Table implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @Id
        @Column(name="column_a")
        private int columnA;
    
    0 讨论(0)
  • 2020-12-04 18:33

    While using the @Id annotation with fields of directly supported types is not the only way to specify an entity's identity (see @IdClass with multiple @Id annotations or @EmbeddedId with @Embedded), the JPA specification requires a primary key for each entity.

    That said, you don't need entities to use JPA with database views. As mapping to a view is no different from mapping to a table from an SQL perspective, you could still use native queries (createNativeQuery on EntityManager) to retrieve scalar values instead.

    0 讨论(0)
  • 2020-12-04 18:36

    I've been looking into this myself, and I've found a hack that I'm not 100% certain works but that looks promising.

    In my case, I have a FK column in the view that can effectively function as a PK -- any given instance of that foreign object can only occur once in the view. I defined two objects off of that one field: one is designated the ID and represents the raw value of the field, and the other is designated read-only and represents the object being referred to.

    
    @Id
    @Column(name = "foreignid", unique = true, nullable = false)
    public Long getForeignId() {
    ...
    
    @OneToOne
    @JoinColumn(name = "foreignid", insertable=false, updatable=false)
    public ForeignObject getForeignObject() {
    ...
    

    Like I said, I'm not 100% sure on this one (and I'll just delete this answer if it turns out not to work), but it got my code past a particular crash point.

    Dunno if it applies to your specific situation, though. And there's an excellent chance that after 11 months, you no longer care. :-) What the hell, that "Necromancer" badge doesn't just earn itself....

    0 讨论(0)
提交回复
热议问题