目前,Hibernate允许我直接加载由*-to-one关系定义的对象
entity1.getEntity2()
Run Code Online (Sandbox Code Playgroud)
是否可以获取外键而不是对象?
我看到的当前方法是对我的映射添加addint:
@JoinColumn(name="message_key")
@ManyToOne(targetEntity=Message.class,fetch=FetchType.LAZY)
private Message message; //these lines currently exist
@Column(name="message_key")
private Long message_fk; //the idea is to add those 2 lines
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来获取外键,或者这是唯一的?
有没有人知道Hibernate在session.saveOrUpdate()调用时是如何知道INSERT还是更新数据库中的值?
到目前为止,我只确定它不依赖于缓存中的信息,并且数据库中实体的存在是由主键确定的.
我有一个具有NON-ID字段的实体,必须从序列中设置.目前,我获取序列的第一个值,将其存储在客户端,并从该值进行计算.
但是,我正在寻找一种"更好"的方式来做到这一点.我已经实现了一种获取下一个序列值的方法:
public Long getNextKey()
{
Query query = session.createSQLQuery( "select nextval('mySequence')" );
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
Run Code Online (Sandbox Code Playgroud)
但是,这种方式会显着降低性能(〜5000个对象的创建速度减慢了3倍 - 从5740ms减少到13648ms).
我试图添加一个"假"实体:
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法也不起作用(所有返回的Ids都是0).
有人可以告诉我如何有效地使用Hibernate获取下一个序列值吗?
编辑:经过调查,我发现调用的Query query = session.createSQLQuery( "select nextval('mySequence')" );效率远低于使用@GeneratedValue- 因为Hibernate 以某种方式设法减少访问所描述的序列时的提取次数@GeneratedValue.
例如,当我创建70,000个实体时(因此从同一序列中获取70,000个主键),我得到了我需要的一切.
但是,Hibernate只发出1404个 select nextval ('local_key_sequence') …
在使用python 2.7时,是否有一种优雅的方法可以从SQLite SELECT查询中获取单个结果?
例如:
conn = sqlite3.connect('db_path.db')
cursor=conn.cursor()
cursor.execute("SELECT MAX(value) FROM table")
for row in cursor:
for elem in row:
maxVal = elem
Run Code Online (Sandbox Code Playgroud)
有没有办法避免那些嵌套的fors并直接获取值?我试过了
maxVal = cursor[0][0]
Run Code Online (Sandbox Code Playgroud)
没有任何成功.
是否可以让非主键在每次插入时自动递增?
例如,我想要一个日志,其中每个日志条目都有一个主键(供内部使用)和一个修订号(我希望自动递增的INT值).
作为一种解决方法,这可以通过序列完成,但我相信SQLite不支持序列.
这是一个类似于以下问题:HQL - 分页的行标识符
我正在尝试使用HQL实现分页.我有一个PostgreSQL数据库.
int elementsPerBlock = 10;
int page = 2; //offset = 2*10
String sqlQuery = "FROM Messages AS msg " +
" LEFT JOIN FETCH msg.commands AS cmd " +
"ORDER BY msg.identifier ASC" ;
Query query = session.createQuery( sqlQuery )
.setFirstResult( elementsPerBlock * ( (page-1) +1 ) )
.setMaxResults( elementsPerBlock );
Run Code Online (Sandbox Code Playgroud)
会发生什么是Hibernate获取所有消息,并在它们全部加载后返回所需的消息.
因此,Hibernate获取210000个实体而不是返回的30个实体(每个Messages只有2个命令).
有没有办法将开销减少7000倍?
编辑:我尝试添加 .setFetchSize( elementsPerBlock ) .它没有帮助.
编辑2:生成的SQL查询是:
select ...
from schemaName.messages messages0_
left outer join schemaName.send_commands commands1_
on messages0_.unique_key=commands1_.message_key
order by messages0_.unique_identifier …Run Code Online (Sandbox Code Playgroud) 在Hibernate 3.6中,对延迟约束的支持是什么?
正如我所知,在3.2中,"Hibernate不支持延迟约束." (来自http://opensource.atlassian.com/projects/hibernate/browse/HHH-2248)
我一直在阅读Hibernate文档,但我没有找到任何可以解释如何执行以下操作的内容.
我有以下我想要转换为HQL的SQL代码:
SELECT {msg.*}, {cmd.*}
FROM Schema.Messages AS msg
LEFT OUTER JOIN schema.send_commands AS cmd
ON cmd.message_key = msg.unique_key
AND ( lower(cmd.status) IN (lower('failed') ) )
WHERE msg.sequence_received < 10";
Run Code Online (Sandbox Code Playgroud)
我遇到的主要问题是我在LEFT OUTER JOIN上没有两个条款.HQL允许我拥有
ON cmd.message_key = msg.unique_key
,但我如何添加
AND clause 2?
javascript中的switch/case语句是比较类型还是仅比较值?
换句话说,当我有以下代码时:
switch (variable)
{
case "0": [...] break;
case "1": [...] break;
default: [...] break;
}
Run Code Online (Sandbox Code Playgroud)
它等同于
if ( variable == "0" )
{
[...]
}
else if ( variable == "1" )
{
[...]
}
else
{
[...]
}
Run Code Online (Sandbox Code Playgroud)
或者
if ( variable === "0" )
{
[...]
}
else if ( variable === "1" )
{
[...]
}
else
{
[...]
}
Run Code Online (Sandbox Code Playgroud)
编辑:有没有办法强制比较值和类型?
我正在尝试使用python将作为参数接收的字符串插入到sqlite数据库中:
def addUser(self, name):
cursor=self.conn.cursor()
t = (name)
cursor.execute("INSERT INTO users ( unique_key, name, is_online, translate) VALUES (NULL, ?, 1, 0);", t)
self.conn.commit()
Run Code Online (Sandbox Code Playgroud)
我不想使用字符串连接,因为http://docs.python.org/library/sqlite3.html建议不要使用它.
但是,当我运行代码时,我得到了异常
cursor.execute("INSERT INTO users ( unique_key, name, is_online, translate) VALUES (NULL, ?, 1, 0);", t)
pysqlite2.dbapi2.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 7 supplied
Run Code Online (Sandbox Code Playgroud)
为什么Python按字符分割字符串,有没有办法阻止它这样做?
编辑:
更改为t = (name,)
给出以下异常
print "INSERT INTO users ( unique_key, name, is_online, translate) VALUES (NULL, ?, 1, 0)" + t …Run Code Online (Sandbox Code Playgroud) hibernate ×6
sql ×5
sqlite ×3
hql ×2
java ×2
python ×2
constraints ×1
database ×1
foreign-keys ×1
javascript ×1
left-join ×1
mapping ×1
nextval ×1
pagination ×1
sequence ×1