我想使用条件来进行以下查询.我有一个实体与EmbeddedId定义:
@Entity
@Table(name="TB_INTERFASES")
public class Interfase implements Serializable {
@EmbeddedId
private InterfaseId id;
}
@Embeddable
public class InterfaseId implements Serializable {
@Column(name="CLASE")
private String clase;
}
Run Code Online (Sandbox Code Playgroud)
我想要做的标准查询是:
CriteriaBuilder criteriaBuilder = this.entityManager.getCriteriaBuilder();
CriteriaQuery<Interfase> criteriaQuery = criteriaBuilder.createQuery(Interfase.class);
Root<Interfase> entity = criteriaQuery.from(Interfase.class);
criteriaQuery.where(
criteriaBuilder.equal(entity.get("clase"), "Clase"),
);
Run Code Online (Sandbox Code Playgroud)
但是这会抛出IllegalArgumentException:
java.lang.IllegalArgumentException: Not an managed type: class InterfaseId
Run Code Online (Sandbox Code Playgroud)
我也尝试过这个问题:
Root<Interfase> entity = criteriaQuery.from(Interfase.class);
criteriaQuery.where(
criteriaBuilder.equal(entity.get("id").get("clase"), "Clase"),
);
Run Code Online (Sandbox Code Playgroud)
而且这个......
Root<Interfase> entity = criteriaQuery.from(Interfase.class);
criteriaQuery.where(
criteriaBuilder.equal(entity.get("id.clase", "Clase"),
);
Run Code Online (Sandbox Code Playgroud)
没有运气.所以我的问题是,当我的类使用Embedded和EmbeddedId注释时,如何使用条件进行查询?
谢谢!.毛罗.
我的数据库中有以下表格:
Announcements:
- AnnouncementID (PK)
- Title
AnouncementsRead (composite PK on AnnouncementID and UserID):
- AnnouncementID (PK)
- UserID (PK)
- DateRead
Users:
- UserID (PK)
- UserName
Run Code Online (Sandbox Code Playgroud)
通常我会使用多对多关系映射"AnnouncementsRead",但此表还有一个额外的"DateRead"字段.
到目前为止,我已经定义了以下实体:
public class Announcement
{
public virtual int AnnouncementID { get; set; }
public virtual string Title { get; set; }
public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }
public Announcement()
{
AnnouncementsRead = new List<AnnouncementRead>();
}
}
public class AnnouncementRead
{
public virtual Announcement Announcement { get; set; } …Run Code Online (Sandbox Code Playgroud) nhibernate composite-key nhibernate-mapping fluent-nhibernate composite-id
我们有一个我们无法改变的遗留数据库.我们正试图转移到NHibernate而不是旧的DataAccess层,这是一个垃圾,而且速度太慢.
它有这样的表:
GPI表有(PU_ID,PAR_ID,Data,Data2)列
BLOCK表有(GA_ID,Data,PAR_ID)列
COMPANY表有(PU_ID,Data)列
我为上面的表创建了这些映射:
GPI
<class name="GroupPartnerInterest" table="[GPI]">
<composite-id >
<key-property name="GroupId" column="PAR_ID" />
<key-property name="CompanyId" column="PU_ID" />
</composite-id>
<property name="data" column="Data"/>
<property name="data2" column="Data2"/>
<many-to-one name="Company" fetch="select" cascade="none">
<column name="PU_ID"/>
</many-to-one>
<set name="Blocks" cascade="none" inverse="true" fetch="select">
<key property-ref="GroupId">
<column name="PAR_ID"/>
</key>
<one-to-many class="Block"/>
</set>
</class>
Run Code Online (Sandbox Code Playgroud)
块
<class name="Block" table="[BLOCK]" >
<id name="BlockId" column="GA_ID" >
<generator class="assigned"/>
</id>
<property name="data" column="Data"/>
<property name="GroupId" column="PAR_ID"/>
<set name="GroupPartnerInterests" cascade="all-delete-orphan" fetch="select">
<key property-ref="GroupId">
<column name="PAR_ID"/>
</key>
<one-to-many class="GroupPartnerInterest"/>
</set>
</class>
Run Code Online (Sandbox Code Playgroud)
公司 …
我有一个在我的类结构上定义的复合id,如下所示.不幸的是,我总是得到一个hibernate错误,抱怨未找到"part2":
"在实体MoreClass:part2中找不到@IdClass的属性"
任何人都可以帮我解决问题吗?(或者至少指出一个有用的jpa/hibernate doc?)
@IdClass(ClassKey.class)
@Entity
public class MoreClass extends LessClass implements Serializable
{
@Id
String part1;
}
@MappedSuperclass
public class LessClass implements Serializable
{
@Id
String part2;
}
public class ClassKey implements Serializable
{
String part1;
String part2;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate的JPA impl对某些表进行建模。我在映射表时遇到了麻烦:
我试图破解它并将索引定义为复合ID,但是由于某些列可为空,因此无法正常工作。JPA / Hibernate有可能吗?
谢谢
我正在使用使用复合键的旧数据库.我正在尝试使用NHibernate将新记录插入数据库.NHibernate指定我必须手动创建Id,但是当我尝试使用此id插入时,我收到消息:
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
Run Code Online (Sandbox Code Playgroud)
我无法触及任何数据库设置,因为它们由美国总部管理.
我发现我可以通过以下方式进行数据库插入:
insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
Run Code Online (Sandbox Code Playgroud)
并且tablename_id列自动递增.
是否可以编写某种处理程序,允许我ID使用该CountryId集创建一个对象并让它自动增加该Id属性.
干杯.
示例代码:
表定义:
CREATE TABLE [dbo].[tablename](
[tablename_country_id] [int] NOT NULL,
[tablename_id] [int] IDENTITY(1,1) NOT NULL,
-- more fields here
CONSTRAINT [pk_tablename] PRIMARY KEY
(
[tablename_country_id] ASC,
[tablename_id] ASC
)
)
Run Code Online (Sandbox Code Playgroud)
类文件:
public class ModelObject
{
public ID { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用休眠映射实体,但是使用 SQL Server,我无法继续。
以下是详细信息。
SQL Server 实体
CREATE TABLE [dbo].[BOOK_EMBEDDED](
[row_id] [bigint] IDENTITY(1,1) NOT NULL,
[group_no] [int] NOT NULL,
[book_name] [varchar](255) NULL,
CONSTRAINT [PK_BOOK_EMBEDDED] PRIMARY KEY CLUSTERED
(
[group_no] ASC,
[row_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
==============================
嵌入式密钥
---------------------------
@Embeddable
public class EmbeddedKey implements Serializable {
private static final long serialVersionUID = 1L;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "row_id")
private Long rowId;
@Column(name …Run Code Online (Sandbox Code Playgroud) 我会尽量保持这种简洁,但希望不要错过任何重要信息.我相信的代码提供了所有细节,但我遗漏了噪音(这是VB,所以有很多噪音:)).
"Case"对象有许多"赋值":
Public Class Case
Property CaseId As Guid
Property Assignments As ISet(Of CaseAssignment)
End Class
Public Class CaseAssignment
Property Case As Case
Property RoleId As Guid
End Class
Run Code Online (Sandbox Code Playgroud)
我已经交过的数据模型看起来与你期望的一样,除了CaseAssignment是一个复合键:
table Case
CaseId uniqueid not null primary key
...
table CaseAssignment
CaseId uniqueid not null
RoleId uniqueid not null
PK := (CaseId, RoleId)
FK from CaseId -> Case.CaseId
Run Code Online (Sandbox Code Playgroud)
最后,Fluent NHibernate映射:
Class CaseMapping
Public Sub New()
Table("Case")
KeyColumn("CaseId")
HasMany(Function(x) x.Assignments).KeyColumn("CaseId").Cascade.AllDeleteOrphan()
End Class
Class CaseAssignmentMapping
Public Sub New()
Table("CaseAssignment")
CompositeId() _
.KeyReference(Function(x) …Run Code Online (Sandbox Code Playgroud) 我正在试图弄清楚如何使用CompositeId来映射另一个类.这是一个测试用例:
表格:
TestParent:
TestParentId (PK)
FavoriteColor
TestChild:
TestParentId (PK)
ChildName (PK)
Age
Run Code Online (Sandbox Code Playgroud)
C#中的类:
public class TestParent
{
public TestParent()
{
TestChildList = new List<TestChild>();
}
public virtual int TestParentId { get; set; }
public virtual string FavoriteColor { get; set; }
public virtual IList<TestChild> TestChildList { get; set; }
}
public class TestChild
{
public virtual TestParent Parent { get; set; }
public virtual string ChildName { get; set; }
public virtual int Age { get; set; }
public override …Run Code Online (Sandbox Code Playgroud) mapping nhibernate nhibernate-mapping fluent-nhibernate composite-id
好吧,我的情景
public class Permission
{
public virtual Function Function { get; set; }
public virtual Profile Profile { get; set; }
}
public class MapPermission : ClassMap<Permission>
{
public MapPermission()
{
Table("Permissions".ToUpper());
CompositeId().KeyProperty(x => x.Function, "FunctionID").KeyProperty(x => x.Profile, "ProfileID");
}
}
Run Code Online (Sandbox Code Playgroud)
其中Function AND Profile是两个简单映射的实体.当我运行我有这个错误:
无法确定类型:Data.Model.Entities.Function,Data.Model,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null,对于列:NHibernate.Mapping.Column(FunctionID)"}
有办法避免这种情况吗?最终我需要创建一个由两个自定义映射类构成的CompositeID类.如果我将compositeID与int字段一起使用,它就像魅力一样
提前致谢
功能(如配置文件)映射
public class Function
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
}
public class MapFunction : ClassMap<Function> …Run Code Online (Sandbox Code Playgroud) composite-id ×10
nhibernate ×5
jpa ×4
hibernate ×3
java ×2
.net ×1
c# ×1
criteria-api ×1
custom-type ×1
jpa-2.0 ×1
mapping ×1
sql-server ×1