我正在使用NHibernate的自定义命名查询,我想返回Person对象的集合.Person对象没有映射到NHibernate映射,这意味着我得到以下异常:
System.Collections.Generic.KeyNotFoundException:给定的键不在字典中.
在创建Session时会抛出它,因为它在调用NHibernate.Cfg.Mappings.GetClass(String className)时找不到类名.这一切都是可以理解的,但我想知道是否有任何方法告诉NHibernate使用该类,即使我没有它的映射?
我想为我的dao写一个Junit测试,但我有一个问题.这是我想测试的方法:
public boolean boo(final String param) {
final Query query = this.entityManager.createNamedQuery("queryName");
query.setParameter(1, param);
boolean isExists = false;
if(query.getResultList().size() != 0) {
isExists = true;
}
return isExists;
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是:
query.setParameter(1, param);
Run Code Online (Sandbox Code Playgroud)
当我写下这样的东西:
@Test
public void test() {
when(entityManager.createNamedQuery(queryName)).thenReturn(query);
when(query.getResultList()).thenReturn(new ArrayList());
//when(query.setParameter(1,project.getName())).thenCallRealMethod();
projectDao.boo(name);
}
Run Code Online (Sandbox Code Playgroud)
查询和entityManager被模拟.我有NPE,这并不奇怪,我不能调用该方法,因为查询是和接口.那么有人可以告诉我在测试时在NamedQueries中设置参数的最佳方法吗?
我有3个bean:组织,角色,用户
角色 - 组织关系 - @ManyToOne
角色 - 用户关系 - @ManyToMany
组织:
@Entity
@Table(name = "entity_organization")
public class Organization implements Serializable {
private static final long serialVersionUID = -646783073824774092L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
Long id;
String name;
@OneToMany(targetEntity = Role.class, mappedBy = "organization")
List<Role> roleList;
...
Run Code Online (Sandbox Code Playgroud)
作用:
@Entity
@Table(name = "entity_role")
public class Role implements Serializable {
private static final long serialVersionUID = -8468851370626652688L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
Long id;
String name;
String description;
@ManyToOne
Organization organization;
...
Run Code Online (Sandbox Code Playgroud)
用户:
@Entity …Run Code Online (Sandbox Code Playgroud) 有没有办法使用HQL在Grails中使用Hibernate命名查询?
我在Harnessing Hibernate一书中一直在阅读它们,并想知道是否有办法在Grails中使用它们.
在如下的<class-name>.hbm.xml映射文件中包含命名查询以及类映射:
<query name="com.oreilly.hh.tracksNoLongerThan">
<![CDATA[
from Track as track
where track.playTime <= :length
]>
</query>
Run Code Online (Sandbox Code Playgroud)
现在我确定可以包含一个<class-name>.hbm.xml hibernate映射文件并将其集成到Grails GORM配置中,因为这里说明hibernate.cfg.xml包含hibernate映射文件的内容可以在Grails中使用.
在旧的Hibernate和Java中,它可以通过以下方式访问:
...
Query query = session.getNamedQuery(
"com.oreilly.hh.tracksNoLongerThan");
query.setTime("length", length);
return query.list();
...
Run Code Online (Sandbox Code Playgroud)
但是,如何从Grails访问这些HQL命名查询?
我问的原因是我希望能够获取遗留数据库并将其映射到某些对象以便在Grails中使用,并将命名查询与映射一起存储.
我有以下命名查询:
@NamedQuery(
name = "Userdetails.findByUsername",
query = "SELECT u FROM Userdetails u WHERE u.username = :username"
)
Run Code Online (Sandbox Code Playgroud)
当我尝试按如下方式执行时:
getEntityManager()
.createNamedQuery("Userdetails.findByUsername")
.setParameter("string", "%" + string + "%")
.getResultList();
Run Code Online (Sandbox Code Playgroud)
然后我得到以下异常:
java.lang.IllegalArgumentException:您试图使用查询字符串中不存在的字符串名称设置参数值SELECT u FROM Userdetails u WHERE u.username =:username.
这是怎么造成的,我该如何解决?
假设实体中有一些命名查询,那些命名查询应该如何评论?有没有办法将它们映射到创建的javadoc?
@Entity
@NamedQueries({
@NamedQuery(name="Country.findAll",
query="SELECT c FROM Country c"),
@NamedQuery(name="Country.findByName",
query="SELECT c FROM Country c WHERE c.name = :name"),
})
public class Country {
...
}
Run Code Online (Sandbox Code Playgroud)
目前我把评论(非javadoc)放在行前但我不太喜欢它.
// find all countries
@NamedQuery(name="Country.findAll", query="SELECT c FROM Country c")
Run Code Online (Sandbox Code Playgroud) 您好我尝试在nhibernate中使用存储过程,我发现了一些方法:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="CO_Visites_Treeview_Sel">
exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
如果我想使用我将使用的数据:
var query = session.GetNamedQuery("CO_Visites_Treeview_Sel");
query.SetString("Idclient", lstClients.SelectedValue.ToString());
query.SetInt32("Idmagasin", 36);
query.SetBoolean("Autre", false);
query.SetBoolean("Tous", true);
var results = query.List();
Run Code Online (Sandbox Code Playgroud)
在那种情况下,我不会有智慧结果['colName']
我用另一种方法:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess" lazy="true">
<id name="Idvisite" column="IDVISITE" type="string">
<generator class="assigned" />
</id>
<property column="NOMMAGASIN" name="Nommagasin" type="string" />
<property column="DATEVIS" name="Datevis" type="DateTime" />
<property column="INTERVENTION" name="Intervention" type="Boolean" />
<property column="IDFACTURE" name="Idfacture" type="string" />
<property column="STATUT" name="Statut" type="byte" />
<property column="NOFACTURE" …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Hibernate Criteria与命名的性能查询进行比较.我知道这一切都取决于实际的查询本身,最后一个词是关于他们如何在运行时分析.仍然,试图理清每个内容.
我试图将Q分为两部分,并在两者上寻找验证/更正:
第1部分 - Hibernate Criteria和命名查询的工作原理如下:
标准适用于参数.在运行时,查询不需要解析 - 有几个搜索和"存在形式"参数,如命令结果,返回它们可滚动等.没有读取/验证这一点,但Criteria工作的字段索引(根据它们设置的参数)使速度更快.
因此,与普通HQL相比,Criteria的优势在于它在执行过程中的速度.
命名查询与HQL具有相同的优势 - 查询在启动时被解析一次.然后从应用程序中的任何需要执行.
第2部分 - 比较两者:
所以在这张照片中,
Criteria和named-queries如何相互比较?
标准适用于跨多个表和多个参数的复杂查询 - 具有优化的方法,从而使查询快速(?)
命名查询具有"定义一次使用 - 无处不在"的优点,并且对于"轻量级"查询非常好 - 通常在单个表上具有少量参数的较不复杂的搜索.频繁查询甚至更好.
注意:看到非常有用的Hibernate Criteria vs HQL:哪个更快?在其他一些讨论中.
TIA.
牌
public class Brand implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "BrandID", nullable = false)
private Integer brandID;
@Basic(optional = false)
@Column(name = "BrandName", nullable = false, length = 100)
private String brandName;
@Basic(optional = false)
@Column(name = "Description", nullable = false, length = 1000)
private String description;
@Column(name = "Is_Visible")
private Boolean isVisible;
@JoinTable(name = "brandcategory", joinColumns = {
@JoinColumn(name = "BrandID", referencedColumnName = "BrandID")}, inverseJoinColumns = …Run Code Online (Sandbox Code Playgroud) 我得到了异常,org.hibernate.HibernateException: Errors in named queries: ElaborazionePagamentiMaggioriOneri.estrai但命名查询对我来说是正确的.我也明白了
org.hibernate.hql.ast.QuerySyntaxException: ElaborazionePagamentiMaggioriOneri is not mapped [FROM ElaborazionePagamentiMaggioriOneri e WHERE e.dataInizioLancio IS NULL AND e.dataFineLancio IS NULL AND e.distinta IS NULL]
Run Code Online (Sandbox Code Playgroud)
我的实体如下:
@Entity(name="ELABORAZIONE_PAGAMENTI")
@Table(name="ELABORAZIONE_PAGAMENTI")
@NamedQuery(name="ElaborazionePagamentiMaggioriOneri.estrai",
query="FROM ElaborazionePagamentiMaggioriOneri e WHERE e.dataInizioLancio IS NULL AND e.dataFineLancio IS NULL AND e.distinta IS NULL")
public class ElaborazionePagamentiMaggioriOneri {
@Id
@GeneratedValue
@Column(name="ID_ELABORAZIONE")
private long idElaborazione;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_INTERVALLO")
private Intervallo intervallo;
@Column(name="IMPORTO_MINIMO")
private BigDecimal importoMinimo;
@Column(name="IMPORTO_MASSIMO")
private BigDecimal importoMassimo;
@Column(name="LIMITE_DISPOSIZIONI")
private Long limiteDisposizioni;
@Column(name="DATA_INIZIO_LANCIO")
private Calendar dataInizioLancio;
@Column(name="DATA_FINE_LANCIO")
private …Run Code Online (Sandbox Code Playgroud) named-query ×10
jpa ×5
hibernate ×4
java ×4
nhibernate ×2
c# ×1
criteria ×1
derby ×1
grails ×1
grails-orm ×1
hql ×1
join ×1
junit ×1
many-to-many ×1
mockito ×1
mysql ×1
orm ×1
parameters ×1
sql ×1