簡體   English   中英

如何將 PostgreSQl 視圖與 Java 中的休眠連接起來?

[英]How to connect PostgreSQl view with hibernate in Java?

我確實有一個 java web 應用程序,它使用 Hibernate ORM 進行數據庫連接。 數據庫表有很多,主要配置為hibernate xml mapping files ,即hbm.xml ,其中每個文件都是數據庫中的一個表。

現在的問題是, - 數據庫中有一個用 postgreSQl 創建的視圖,我想在 java 中使用該視圖,該怎么做? 如果我創建另一個hbm.xml文件,它將是在數據庫中創建的表。 我已經在互聯網上閱讀了有關如何將它與注釋一起使用的示例,但我沒有在我的 Web 應用程序中配置它。

更新1:

經過對以下答案的一些研究和建議,這就是我所擁有的自動取款機:

我為每個屬性創建了xml映射文件和一個帶有 getter/setter 的 java 類:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"

>

<hibernate-mapping>
<class name="org.xxx.model.SearchView" table="search" mutable="false">

    <id name="uuId" column="uuid">

    </id>


    <property name="typeOfCRA" column="typeofcra" />

    <property name="birthDate" column="birthDate" />

    <property name="lastName" column="lastname" />

    <property name="firstName" column="firstname" />

    <property name="middleName" column="middlename" />

    <property name="recordId" column="recordid" />

    <property name="registrationDate" column="registrationdate" />

    <property name="state" column="state" />

    <property name="organisationunitId" column="organisationunitid" />

    <property name="version" column="version" />

    <property name="gender" column="gender" />


</class>
</hibernate-mapping>

這就是我在 java 中調用它以從數據庫中獲取結果列表的方式:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeofcra", "birth"));
List<SearchView> tmp =criteria.list();

它不會給出任何錯誤。 它根據我的標准不斷返回 0 條記錄。 但是當我使用相同的標准直接在Postgresql過濾掉它時,它返回了近 60 萬個結果。

在編譯或運行此代碼片段期間,也有 0 個錯誤。 任何幫助表示贊賞。

更新2:

休眠配置文件:

connection.dialect = org.hibernate.dialect.PostgreSQLDialect
connection.driver_class = org.postgresql.Driver
connection.url = jdbc:postgresql://localhost:5432/finalDb
connection.username = postgres
connection.password = root
connection.schema = update

根據以下答案更新代碼:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeOfCRA", "%birth%"));
List<SearchView> tmp =criteria.list();

PgAdmin 中的直接調用有效:

SELECT typeofcra, dateofbirth, lastname, firstname, middlename, recordid, 
   registrationdate, state, organisationunitid, uuid, version, gender
 FROM public.search where typeofcra like '%birth%';

但是從java它不起作用。

根據上面發布的休眠映射文件,您的SearchView實體中有typeOfCRA字段。 問題在於您的Restriction 如果你想執行like操作,你可以這樣做

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeOfCRA", "%birth%")); //Changed code here
List<SearchView> tmp =criteria.list();

上面的查詢將獲取typeofcra包含birth所有記錄。 如果要執行不區分大小寫的搜索,可以使用ilike限制。

更新

問題在於您的 Hibernate 映射文件名。 Hibernate 映射文件名應與您的實體/類名相同。 SearchView 類的休眠映射文件名中存在拼寫錯誤。 Searview.hbm.xml -> SearchView.hbm.xml更改文件名,它應該可以解決您的問題

您可以為視圖創建一個實體並設置mutable="false"

<hibernate-mapping>
    <class name="com.MyView" mutable="false">
       <!--properties-->
    </class>
</hibernate-mapping>

然后使用,

List<MyView> bvs = em.createQuery("SELECT v FROM MyView v", MyView.class).getResultList();

希望能幫助到你。

如果您可以使用注釋,請嘗試以下鏈接https://thoughts-on-java.org/hibernate-tips-map-view-hibernate/

它可以像任何表一樣映射。 只需定義名稱和列。 標准表不是只讀的,但您不能對視圖執行更新。 您可以通過使用 Hibernate 的@Immutable注釋來注釋您的實體來做到這@Immutable

@Entity 
@Immutable 
public class MyCustomView { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", updatable = false, nullable = false) 
    private Long id; 

    ...

}

如果您更改某些值,Hibernate 現在將只執行SELECT ,但不會執行UPDATE

暫無
暫無

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

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