代码之家  ›  专栏  ›  技术社区  ›  Burdel

JPA:名称的命名查询:。。。未找到

  •  0
  • Burdel  · 技术社区  · 7 年前

    我正在我的公司用JPA开发一个多功能应用程序。因此,我使用TABLE_PER_TENANT特性将特定于租户的数据分离到不同的模式中。将数据推入数据库没有问题,这很好。问题是仅仅从数据库中读取数据,应用程序无法找到我的命名查询。

    • 重新编译和部署应用程序
    • 移动持久性。xml到不同的文件夹中
    • 看看所有可能的解决方案,我可以在谷歌上找到,并尝试他们。。。

    我错过了什么?有什么想法吗?

    BaseObject。Java语言

    @MappedSuperclass
    @Multitenant(MultitenantType.TABLE_PER_TENANT)
    @TenantTableDiscriminator(type = TenantTableDiscriminatorType.SCHEMA, contextProperty="tenant.id")
    public abstract class BaseObject {
    
        /**
         * The (globally unique) ID of the object.
         */
        @Id
        @Column(name = "GUID", length = 36)
        private String guid = UUID.randomUUID().toString();
    
        /**
         * The {@link Date} the object was created at.
         */
        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "CREATION_DATE", updatable = false)
        private Date createdAt = null;
    
        /**
         * The {@link Date} the object was last modified at.
         */
        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "MODIFICATION_DATE")
        private Date lastModifiedAt = null;
    
        /**
         * ID of the user who created the object.
         */
        @Column(name = "CREATED_BY", updatable = false, length = 20)
        private String createdBy = null;
    
        /**
         * ID of the user who was the last to modify the object.
         */
        @Column(name = "MODIFIED_BY", length = 20)
        private String lastModifiedBy = null;
    
        // Methods...
    }
    

    @Entity
    @Table(name = "PLANT_POLLUTION_DATA")
    @NamedQueries({ @NamedQuery(name = "Plant.getPlants", query = "SELECT c FROM Plant c"),
                    @NamedQuery(name = "Plant.getPlantById", query = "SELECT c FROM Plant c WHERE c.id = :id") })
    
    @XmlRootElement(name = "plantlist")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Plant extends BaseObject implements Serializable {
    
        /**
         * The <code>serialVersionUID</code> of the {@link Plant} class.
         */
        private static final long serialVersionUID = 1L;
    
        @Column(name = "ID", length = 36, nullable = true)
        String id = null;
    
        @Column(name = "O3", length = 10, nullable = true)
        String o3 = null;
    
        @Column(name = "DATE_FIELD")
        java.sql.Date dateField = null;
    
        @Column(name = "location", length = 36, nullable = true)
        String location = null;
    
        // Methods...
    }
    

    NamedQuery调用

    String tenantId = getTenantId();
    Map<String, String> props = new HashMap<String, String>();
    props.put("tenant.id", tenantId);
    EntityManager em = this.getEntityManagerFactory().createEntityManager(props);
    Query query = em.createNamedQuery("Plant.getPlantById");
    query.setParameter("id", id);
    retVal = query.getResultList();
    

    坚持不懈xml (位于“file.war/WEB-INF/classes/META-INF/persistence.xml”)

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
        <persistence-unit name="pollutionmonitoring" transaction-type="RESOURCE_LOCAL">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <class>com.company.cloud.samples.pollutionmonitoring.model.BaseObject</class>
            <class>com.company.cloud.samples.pollutionmonitoring.model.Plant</class>
            <properties>
                <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
            </properties>
        </persistence-unit>
    </persistence>
    
    1 回复  |  直到 7 年前
        1
  •  -1
  •   Burdel    7 年前

    ...
    EntityManager em = this.getEntityManagerFactory().createEntityManager(props);
    
    em.getTransaction().begin();
    em.getTransaction().commit();
    
    Query query = em.createNamedQuery("Plant.getPlantById");
    ...
    

    我不知道这个改变到底有什么作用,但它对我有效:)也许有人知道为什么这个解决方案会起作用?

    PS:我刚刚从我的另一个类中复制了它,我必须在DB中添加数据,这是两个类之间唯一的区别。