首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA:如何使用@NamedQuery从不同的DB2模式中指定表。Schema.Table不能是FROM子句的第一个声明

JPA:如何使用@NamedQuery从不同的DB2模式中指定表。Schema.Table不能是FROM子句的第一个声明
EN

Stack Overflow用户
提问于 2021-11-01 13:39:07
回答 1查看 348关注 0票数 1

当从邮递员发送GET请求测试我的端点时,我遇到了一个问题。以前,同一个NamedQueries只使用一个模式,所以不需要区分。现在,我已经更改为运行在本地Docker实例中的DB2,并且正在使用Maven来运行来创建端点。我收到以下错误。我需要创建一个带有实体映射的orm.xml文件,还是需要做一些其他的事情来解决这个问题?如果可能的话,我更希望在没有更多xml文件的情况下这样做。

邮差:

因为“>"javax.persistence.EntityManager.createNamedQuery(String,”是空的,所以

错误500: java.lang.NullPointerException:无法调用java.lang.Class)

Maven:

org.eclipse.persistence.jpa.PersistenceProvider信息提供程序:当它试图为jpa单元持久性单元创建容器实体管理器工厂时,

持久化提供程序发生了错误。发生以下错误:异常EclipseLink-28019EclipseLink-28019信息异常描述:部署PersistenceUnit jpa失败。关闭此PersistenceUnit的所有工厂。

内部异常:异常EclipseLink-0:org.eclipse.persistence.exceptions.JPQLException

信息异常描述:编译问题,从Sankofa.Users u中选择u。

信息'Sankofa.Users u‘不能是FROM子句的第一个声明。

UserDao

代码语言:javascript
复制
package dao;

import java.util.List;
import java.util.concurrent.TimeoutException;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hyperledger.fabric.gateway.ContractException;

import javax.enterprise.context.RequestScoped;
import models.*;

@RequestScoped
public class UserDao {
    
//DB2 Methods
    @PersistenceContext(name = "jpa-unit")
    private EntityManager em;

    public void createUser(Users user){
        em.persist(user);
    }
    
    public Users readUser(int userID){
        return em.find(Users.class, userID);
    }
    //NEED TO DO set return limit to 20
    public List<Users> readAllUsers(){
        return em.createNamedQuery("Users.findAll", Users.class).getResultList();
    }

    public void updateUser(Users user){
        em.merge(user);
    }

    public void deleteUser(Users userID){
        em.remove(userID);
    }

    public List<Users> findUser(String email){
        return em.createNamedQuery("Users.findUser", Users.class)
            .setParameter("email", email)
            .getResultList(); 
    }

    public void createHistory(History hist){
        em.persist(hist);
    }
    //wait this doesnt do anything? 
    public Users readHistory(int userID){
        return em.find(Users.class, userID);
    }

    public List<History> readAllHistory(){
        return em.createNamedQuery("History.findAll", History.class).getResultList();
    }
}

用户

代码语言:javascript
复制
package models;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.persistence.*;
import java.time.LocalDate;

@Entity
@Table(name = "Users")
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.findUser", query = "SELECT usr FROM Users usr WHERE usr.email = :email")
})
public class Users {

    private static JsonObjectBuilder builder = Json.createObjectBuilder();

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    @Column(name = "userId")
    private int id;

    @Column(name = "firstName")
    private String firstName;
    @Column(name = "lastName")
    private String lastName;
    @Column(name = "gender")
    private String gender;
    @Column(name = "address")
    private String address;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;
    @Column(name = "dateOfBirth")
    private LocalDate dateOfBirth;

Persistence.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    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_2.xsd">
    <persistence-unit name="jpa-unit" transaction-type="JTA">
        <mapping-file>orm.xml</mapping-file>
        
        <properties>
            <!-- Connection Specific -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"/>
            
            <property name="javax.persistence.schema-generation.database.action" value="create" />
            <property name="javax.persistence.schema-generation.create-database-schemas" value="true" />
            <property name="javax.persistence.schema-generation.scripts.action" value="create" />
            <property name="javax.persistence.schema-generation.scripts.create-target" value="create.ddl"/>

        </properties>
    </persistence-unit>
</persistence>

Server.xml

代码语言:javascript
复制
<server description="Obdoblock REST Server">
    <featureManager>
        <feature>jaxrs-2.1</feature>
        <feature>openapi-3.1</feature>
        <feature>jpa-2.2</feature>
        <feature>cdi-2.0</feature>
    </featureManager>
  
    <httpEndpoint 
        httpPort="${default.http.port}" 
        httpsPort="${default.https.port}"
        id="defaultHttpEndpoint" 
        host="*" 
    />

    <webApplication 
        location="hyperledger-api.war" 
        contextRoot="${app.context.root}"
    />
    
    <!-- DB2 Library Configuration -->
    <library id="DB2JCCLib">
        <file name="${shared.resource.dir}/jcc-11.5.6.0" />
    </library>
    
    
    <dataSource id="DefaultDataSource" jndiName="jdbc/db2">
        <jdbcDriver libraryRef="jdbcLib"/>
        <properties.db2.jcc
            databaseName="testdb"
            serverName="localhost" 
            portNumber="50000"
            user="****" password="****"
        />
    </dataSource>
</server>

版本:

11.5.6

  • Maven:
  • docker : 20.10.8,构建3967b7
  • DB2: ibm/db2
  • 映像版本 3.8.3
    • Java: JDK 14.0.2

如果需要更多的细节,我很乐意提供。谢谢你,迪伦

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-01 15:28:05

如何使用@NamedQuery从不同的DB2模式指定表

AFAIK,您不能在查询级别配置架构值。在该实体下定义的所有命名查询都将针对同一模式执行。

  1. 数据库模式可以通过orm.xml映射文件在持久性单元级别设置:

orm.xml

<实体-映射…> Sankofa。。。

persistence.xml

<持久性.> orm.xml

  1. For EclipseLink,您可以配置SessionCustomizer类

公共类org.eclipse.persistence.config.SessionCustomizer实现了{@覆盖公共void (会话会话)抛出异常{ session.getLogin().setTableQualifier("Sankofa");}}

persistence.xml

<持久性.>

@

  • 注释具有一个“模式”元素,用于在实体级别配置模式

@Table(name = "Users",schema = "Sankofa")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69797754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档