簡體   English   中英

使用 HQL Select 的 Hibernate 和 JAX-RS 響應

[英]Hibernate and JAX-RS Response with HQL Select

所以我有以下幾點。

我有一個名為 GroupEntity 的實體,它有一個 groupId、名稱和一個 userId,它是與 UserEntity 對應的 id。

我想要的是:帶有 groupentity 和 userentity.name 的 JSON 響應。 但出於某種原因,我收到了 505 錯誤,但沒有任何堆棧跟蹤。

服務:

public GenericEntity<List<GroupEntity>> getMyGroups() throws HibernateException {
        session.beginTransaction();
        Query query = session.createQuery("FROM GroupEntity g inner join g.teacher as teacher");
        List<GroupEntity> groups = (List<GroupEntity>) query.list();
        GenericEntity<List<GroupEntity>> entity = new GenericEntity<List<GroupEntity>>(groups) {};

        return entity;

    }

JAX-RS 資源

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getMyGroups(){

    return Response.ok(groupService.getMyGroups(),
            MediaType.APPLICATION_JSON)
            .build();

}

組實體

    @Entity
@Table(name = "Group", schema = "pad_ijburg", uniqueConstraints = {
        @UniqueConstraint(columnNames = "name")
})

public class GroupEntity implements Serializable {
    private int idGroup;
    private String name;

    @XmlTransient
    private UserEntity teacher;

    public GroupEntity(String name, UserEntity teacher) {
        this.name = name;
    }

    public GroupEntity(){

    }

    @XmlTransient
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "idUser")
    public UserEntity getTeacher() {
        return teacher;
    }

    @XmlTransient
    public void setTeacher(UserEntity teacher) {
        this.teacher = teacher;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getIdGroup() {
        return idGroup;
    }

    public void setIdGroup(int idGroup) {
        this.idGroup = idGroup;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

用戶實體

    @Entity
@Table(name = "User", schema = "pad_ijburg", catalog = "", uniqueConstraints = {
        @UniqueConstraint(columnNames = "email")
})
@Inheritance(strategy = InheritanceType.JOINED)
public class UserEntity implements Serializable{
    private int idUser;

    private String email;
    private String firstName;
    private String lastName;
    //ToDo Make this password secure!
    private String password;
    private boolean admin;
    private boolean teacher;

    //Lists below

    private Set<GroupEntity> teacherGroups = new HashSet<GroupEntity>(
            0);



        public UserEntity(String email, String firstName, String lastName, String password, boolean admin, boolean teacher) {
            this.email = email;
            this.firstName = firstName;
            this.lastName = lastName;
            this.password = password;
            this.admin = admin;
            this.teacher = teacher;
        }

        public UserEntity() {

        }

        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "idUser")
        public int getIdUser() {
            return idUser;
        }

        public void setIdUser(int idUser) {
            this.idUser = idUser;
        }

        @Basic
        @Column(name = "email")
        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        @Basic
        @Column(name = "firstName")
        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        @Basic
        @Column(name = "lastName")
        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        @Basic
        @Column(name = "password")
        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        @Basic
        @Column(name = "admin")
        public boolean getAdmin() {
            return admin;
        }

        public void setAdmin(boolean admin) {
            this.admin = admin;
        }

        @Basic
        @Column(name = "teacher")
        public boolean getTeacher() {
            return teacher;
        }

        public void setTeacher(boolean teacher) {
            this.teacher = teacher;
        }

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "idGroup")
        public Set<GroupEntity> getTeacherGroups() {
            return teacherGroups;
        }

        public void setTeacherGroups(Set<GroupEntity> teacherGroups) {
            this.teacherGroups = teacherGroups;
        }
    }

我認為這與身體作家有關。 問題是:我真的不知道如何解決這個問題。

Bodywriter 錯誤:

2016 年 5 月 29 日 02:29:43.679 嚴重 [http-nio-8079-exec-9] org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter 未找到媒體類型=應用程序/json,類型=類 java.util.ArrayList, genericType=class java.util.ArrayList

更新:

我已經修復了bodywriter。 但我仍然收到 505 錯誤(沒有堆棧跟蹤)。 我已經更新了上面的服務代碼。

更新 2.0 POM.XML:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>org.hva.folivora</groupId>
<artifactId>api</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>IJBurg ReflectionAPP API</name>

<build>
    <finalName>api</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
        <!-- artifactId>jersey-container-servlet</artifactId -->
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.0.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>4.1.0.Final</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.2</version>
    </dependency>

    <!-- Ensures JSON Support for the RESTAPI    -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
    </dependency>

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>1.4</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.37</version>
    </dependency>

</dependencies>
<properties>
    <jersey.version>2.22</jersey.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

更新 3.0

session.beginTransaction();
    Query query = session.createQuery("SELECT g.idGroup, g.name, teacher.idUser FROM GroupEntity g inner join g.teacher as teacher");
    List<Object[]> groups = (List<Object[]>) query.list();

    //GenericEntity<List<GroupEntity>> entity = new GenericEntity<List<GroupEntity>>(groups) {};

    //return entity;

    return groups;

以下將返回以下 json 響應。 數據是正確的。 但它沒有以正確的格式返回。

    [
  [
    3,
    "TestGroup3",
    3
  ]
]

在此先感謝您的幫助!

好的,我為您找到了一個快速的替代解決方案:

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>1.4</version>
</dependency>

此依賴項為您希望以 JSON 格式傳遞的這些類型的對象創建自動數據綁定。 在您的情況下,您想要一個 列表 您可以在此處找到有關Genson 的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM