[英]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.